/**
 * Skipped minification because the original files appears to be already minified.
 * Original file: /npm/chart.js@4.4.4/dist/chart.umd.js
 *
 * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files
 */
/*!
 * Chart.js v4.4.4
 * https://www.chartjs.org
 * (c) 2024 Chart.js Contributors
 * Released under the MIT License
 */
!(function (t, e) {
  "object" == typeof exports && "undefined" != typeof module
    ? (module.exports = e())
    : "function" == typeof define && define.amd
    ? define(e)
    : ((t = "undefined" != typeof globalThis ? globalThis : t || self).Chart =
        e());
})(this, function () {
  "use strict";
  var t = Object.freeze({
    __proto__: null,
    get Colors() {
      return Go;
    },
    get Decimation() {
      return Qo;
    },
    get Filler() {
      return ma;
    },
    get Legend() {
      return ya;
    },
    get SubTitle() {
      return ka;
    },
    get Title() {
      return Ma;
    },
    get Tooltip() {
      return Ba;
    },
  });
  function e() {}
  const i = (() => {
    let t = 0;
    return () => t++;
  })();
  function s(t) {
    return null == t;
  }
  function n(t) {
    if (Array.isArray && Array.isArray(t)) return !0;
    const e = Object.prototype.toString.call(t);
    return "[object" === e.slice(0, 7) && "Array]" === e.slice(-6);
  }
  function o(t) {
    return (
      null !== t && "[object Object]" === Object.prototype.toString.call(t)
    );
  }
  function a(t) {
    return ("number" == typeof t || t instanceof Number) && isFinite(+t);
  }
  function r(t, e) {
    return a(t) ? t : e;
  }
  function l(t, e) {
    return void 0 === t ? e : t;
  }
  const h = (t, e) =>
      "string" == typeof t && t.endsWith("%") ? parseFloat(t) / 100 : +t / e,
    c = (t, e) =>
      "string" == typeof t && t.endsWith("%") ? (parseFloat(t) / 100) * e : +t;
  function d(t, e, i) {
    if (t && "function" == typeof t.call) return t.apply(i, e);
  }
  function u(t, e, i, s) {
    let a, r, l;
    if (n(t))
      if (((r = t.length), s)) for (a = r - 1; a >= 0; a--) e.call(i, t[a], a);
      else for (a = 0; a < r; a++) e.call(i, t[a], a);
    else if (o(t))
      for (l = Object.keys(t), r = l.length, a = 0; a < r; a++)
        e.call(i, t[l[a]], l[a]);
  }
  function f(t, e) {
    let i, s, n, o;
    if (!t || !e || t.length !== e.length) return !1;
    for (i = 0, s = t.length; i < s; ++i)
      if (
        ((n = t[i]),
        (o = e[i]),
        n.datasetIndex !== o.datasetIndex || n.index !== o.index)
      )
        return !1;
    return !0;
  }
  function g(t) {
    if (n(t)) return t.map(g);
    if (o(t)) {
      const e = Object.create(null),
        i = Object.keys(t),
        s = i.length;
      let n = 0;
      for (; n < s; ++n) e[i[n]] = g(t[i[n]]);
      return e;
    }
    return t;
  }
  function p(t) {
    return -1 === ["__proto__", "prototype", "constructor"].indexOf(t);
  }
  function m(t, e, i, s) {
    if (!p(t)) return;
    const n = e[t],
      a = i[t];
    o(n) && o(a) ? x(n, a, s) : (e[t] = g(a));
  }
  function x(t, e, i) {
    const s = n(e) ? e : [e],
      a = s.length;
    if (!o(t)) return t;
    const r = (i = i || {}).merger || m;
    let l;
    for (let e = 0; e < a; ++e) {
      if (((l = s[e]), !o(l))) continue;
      const n = Object.keys(l);
      for (let e = 0, s = n.length; e < s; ++e) r(n[e], t, l, i);
    }
    return t;
  }
  function b(t, e) {
    return x(t, e, { merger: _ });
  }
  function _(t, e, i) {
    if (!p(t)) return;
    const s = e[t],
      n = i[t];
    o(s) && o(n)
      ? b(s, n)
      : Object.prototype.hasOwnProperty.call(e, t) || (e[t] = g(n));
  }
  const y = { "": (t) => t, x: (t) => t.x, y: (t) => t.y };
  function v(t) {
    const e = t.split("."),
      i = [];
    let s = "";
    for (const t of e)
      (s += t),
        s.endsWith("\\") ? (s = s.slice(0, -1) + ".") : (i.push(s), (s = ""));
    return i;
  }
  function M(t, e) {
    const i =
      y[e] ||
      (y[e] = (function (t) {
        const e = v(t);
        return (t) => {
          for (const i of e) {
            if ("" === i) break;
            t = t && t[i];
          }
          return t;
        };
      })(e));
    return i(t);
  }
  function w(t) {
    return t.charAt(0).toUpperCase() + t.slice(1);
  }
  const k = (t) => void 0 !== t,
    S = (t) => "function" == typeof t,
    P = (t, e) => {
      if (t.size !== e.size) return !1;
      for (const i of t) if (!e.has(i)) return !1;
      return !0;
    };
  function D(t) {
    return (
      "mouseup" === t.type || "click" === t.type || "contextmenu" === t.type
    );
  }
  const C = Math.PI,
    O = 2 * C,
    A = O + C,
    T = Number.POSITIVE_INFINITY,
    L = C / 180,
    E = C / 2,
    R = C / 4,
    I = (2 * C) / 3,
    z = Math.log10,
    F = Math.sign;
  function V(t, e, i) {
    return Math.abs(t - e) < i;
  }
  function B(t) {
    const e = Math.round(t);
    t = V(t, e, t / 1e3) ? e : t;
    const i = Math.pow(10, Math.floor(z(t))),
      s = t / i;
    return (s <= 1 ? 1 : s <= 2 ? 2 : s <= 5 ? 5 : 10) * i;
  }
  function W(t) {
    const e = [],
      i = Math.sqrt(t);
    let s;
    for (s = 1; s < i; s++) t % s == 0 && (e.push(s), e.push(t / s));
    return i === (0 | i) && e.push(i), e.sort((t, e) => t - e).pop(), e;
  }
  function N(t) {
    return !isNaN(parseFloat(t)) && isFinite(t);
  }
  function H(t, e) {
    const i = Math.round(t);
    return i - e <= t && i + e >= t;
  }
  function j(t, e, i) {
    let s, n, o;
    for (s = 0, n = t.length; s < n; s++)
      (o = t[s][i]),
        isNaN(o) ||
          ((e.min = Math.min(e.min, o)), (e.max = Math.max(e.max, o)));
  }
  function $(t) {
    return t * (C / 180);
  }
  function Y(t) {
    return t * (180 / C);
  }
  function U(t) {
    if (!a(t)) return;
    let e = 1,
      i = 0;
    for (; Math.round(t * e) / e !== t; ) (e *= 10), i++;
    return i;
  }
  function X(t, e) {
    const i = e.x - t.x,
      s = e.y - t.y,
      n = Math.sqrt(i * i + s * s);
    let o = Math.atan2(s, i);
    return o < -0.5 * C && (o += O), { angle: o, distance: n };
  }
  function q(t, e) {
    return Math.sqrt(Math.pow(e.x - t.x, 2) + Math.pow(e.y - t.y, 2));
  }
  function K(t, e) {
    return ((t - e + A) % O) - C;
  }
  function G(t) {
    return ((t % O) + O) % O;
  }
  function Z(t, e, i, s) {
    const n = G(t),
      o = G(e),
      a = G(i),
      r = G(o - n),
      l = G(a - n),
      h = G(n - o),
      c = G(n - a);
    return n === o || n === a || (s && o === a) || (r > l && h < c);
  }
  function J(t, e, i) {
    return Math.max(e, Math.min(i, t));
  }
  function Q(t) {
    return J(t, -32768, 32767);
  }
  function tt(t, e, i, s = 1e-6) {
    return t >= Math.min(e, i) - s && t <= Math.max(e, i) + s;
  }
  function et(t, e, i) {
    i = i || ((i) => t[i] < e);
    let s,
      n = t.length - 1,
      o = 0;
    for (; n - o > 1; ) (s = (o + n) >> 1), i(s) ? (o = s) : (n = s);
    return { lo: o, hi: n };
  }
  const it = (t, e, i, s) =>
      et(
        t,
        i,
        s
          ? (s) => {
              const n = t[s][e];
              return n < i || (n === i && t[s + 1][e] === i);
            }
          : (s) => t[s][e] < i
      ),
    st = (t, e, i) => et(t, i, (s) => t[s][e] >= i);
  function nt(t, e, i) {
    let s = 0,
      n = t.length;
    for (; s < n && t[s] < e; ) s++;
    for (; n > s && t[n - 1] > i; ) n--;
    return s > 0 || n < t.length ? t.slice(s, n) : t;
  }
  const ot = ["push", "pop", "shift", "splice", "unshift"];
  function at(t, e) {
    t._chartjs
      ? t._chartjs.listeners.push(e)
      : (Object.defineProperty(t, "_chartjs", {
          configurable: !0,
          enumerable: !1,
          value: { listeners: [e] },
        }),
        ot.forEach((e) => {
          const i = "_onData" + w(e),
            s = t[e];
          Object.defineProperty(t, e, {
            configurable: !0,
            enumerable: !1,
            value(...e) {
              const n = s.apply(this, e);
              return (
                t._chartjs.listeners.forEach((t) => {
                  "function" == typeof t[i] && t[i](...e);
                }),
                n
              );
            },
          });
        }));
  }
  function rt(t, e) {
    const i = t._chartjs;
    if (!i) return;
    const s = i.listeners,
      n = s.indexOf(e);
    -1 !== n && s.splice(n, 1),
      s.length > 0 ||
        (ot.forEach((e) => {
          delete t[e];
        }),
        delete t._chartjs);
  }
  function lt(t) {
    const e = new Set(t);
    return e.size === t.length ? t : Array.from(e);
  }
  const ht =
    "undefined" == typeof window
      ? function (t) {
          return t();
        }
      : window.requestAnimationFrame;
  function ct(t, e) {
    let i = [],
      s = !1;
    return function (...n) {
      (i = n),
        s ||
          ((s = !0),
          ht.call(window, () => {
            (s = !1), t.apply(e, i);
          }));
    };
  }
  function dt(t, e) {
    let i;
    return function (...s) {
      return (
        e ? (clearTimeout(i), (i = setTimeout(t, e, s))) : t.apply(this, s), e
      );
    };
  }
  const ut = (t) => ("start" === t ? "left" : "end" === t ? "right" : "center"),
    ft = (t, e, i) => ("start" === t ? e : "end" === t ? i : (e + i) / 2),
    gt = (t, e, i, s) =>
      t === (s ? "left" : "right") ? i : "center" === t ? (e + i) / 2 : e;
  function pt(t, e, i) {
    const s = e.length;
    let n = 0,
      o = s;
    if (t._sorted) {
      const { iScale: a, _parsed: r } = t,
        l = a.axis,
        { min: h, max: c, minDefined: d, maxDefined: u } = a.getUserBounds();
      d &&
        (n = J(
          Math.min(it(r, l, h).lo, i ? s : it(e, l, a.getPixelForValue(h)).lo),
          0,
          s - 1
        )),
        (o = u
          ? J(
              Math.max(
                it(r, a.axis, c, !0).hi + 1,
                i ? 0 : it(e, l, a.getPixelForValue(c), !0).hi + 1
              ),
              n,
              s
            ) - n
          : s - n);
    }
    return { start: n, count: o };
  }
  function mt(t) {
    const { xScale: e, yScale: i, _scaleRanges: s } = t,
      n = { xmin: e.min, xmax: e.max, ymin: i.min, ymax: i.max };
    if (!s) return (t._scaleRanges = n), !0;
    const o =
      s.xmin !== e.min ||
      s.xmax !== e.max ||
      s.ymin !== i.min ||
      s.ymax !== i.max;
    return Object.assign(s, n), o;
  }
  class xt {
    constructor() {
      (this._request = null),
        (this._charts = new Map()),
        (this._running = !1),
        (this._lastDate = void 0);
    }
    _notify(t, e, i, s) {
      const n = e.listeners[s],
        o = e.duration;
      n.forEach((s) =>
        s({
          chart: t,
          initial: e.initial,
          numSteps: o,
          currentStep: Math.min(i - e.start, o),
        })
      );
    }
    _refresh() {
      this._request ||
        ((this._running = !0),
        (this._request = ht.call(window, () => {
          this._update(),
            (this._request = null),
            this._running && this._refresh();
        })));
    }
    _update(t = Date.now()) {
      let e = 0;
      this._charts.forEach((i, s) => {
        if (!i.running || !i.items.length) return;
        const n = i.items;
        let o,
          a = n.length - 1,
          r = !1;
        for (; a >= 0; --a)
          (o = n[a]),
            o._active
              ? (o._total > i.duration && (i.duration = o._total),
                o.tick(t),
                (r = !0))
              : ((n[a] = n[n.length - 1]), n.pop());
        r && (s.draw(), this._notify(s, i, t, "progress")),
          n.length ||
            ((i.running = !1),
            this._notify(s, i, t, "complete"),
            (i.initial = !1)),
          (e += n.length);
      }),
        (this._lastDate = t),
        0 === e && (this._running = !1);
    }
    _getAnims(t) {
      const e = this._charts;
      let i = e.get(t);
      return (
        i ||
          ((i = {
            running: !1,
            initial: !0,
            items: [],
            listeners: { complete: [], progress: [] },
          }),
          e.set(t, i)),
        i
      );
    }
    listen(t, e, i) {
      this._getAnims(t).listeners[e].push(i);
    }
    add(t, e) {
      e && e.length && this._getAnims(t).items.push(...e);
    }
    has(t) {
      return this._getAnims(t).items.length > 0;
    }
    start(t) {
      const e = this._charts.get(t);
      e &&
        ((e.running = !0),
        (e.start = Date.now()),
        (e.duration = e.items.reduce((t, e) => Math.max(t, e._duration), 0)),
        this._refresh());
    }
    running(t) {
      if (!this._running) return !1;
      const e = this._charts.get(t);
      return !!(e && e.running && e.items.length);
    }
    stop(t) {
      const e = this._charts.get(t);
      if (!e || !e.items.length) return;
      const i = e.items;
      let s = i.length - 1;
      for (; s >= 0; --s) i[s].cancel();
      (e.items = []), this._notify(t, e, Date.now(), "complete");
    }
    remove(t) {
      return this._charts.delete(t);
    }
  }
  var bt = new xt();
  /*!
   * @kurkle/color v0.3.2
   * https://github.com/kurkle/color#readme
   * (c) 2023 Jukka Kurkela
   * Released under the MIT License
   */ function _t(t) {
    return (t + 0.5) | 0;
  }
  const yt = (t, e, i) => Math.max(Math.min(t, i), e);
  function vt(t) {
    return yt(_t(2.55 * t), 0, 255);
  }
  function Mt(t) {
    return yt(_t(255 * t), 0, 255);
  }
  function wt(t) {
    return yt(_t(t / 2.55) / 100, 0, 1);
  }
  function kt(t) {
    return yt(_t(100 * t), 0, 100);
  }
  const St = {
      0: 0,
      1: 1,
      2: 2,
      3: 3,
      4: 4,
      5: 5,
      6: 6,
      7: 7,
      8: 8,
      9: 9,
      A: 10,
      B: 11,
      C: 12,
      D: 13,
      E: 14,
      F: 15,
      a: 10,
      b: 11,
      c: 12,
      d: 13,
      e: 14,
      f: 15,
    },
    Pt = [..."0123456789ABCDEF"],
    Dt = (t) => Pt[15 & t],
    Ct = (t) => Pt[(240 & t) >> 4] + Pt[15 & t],
    Ot = (t) => (240 & t) >> 4 == (15 & t);
  function At(t) {
    var e = ((t) => Ot(t.r) && Ot(t.g) && Ot(t.b) && Ot(t.a))(t) ? Dt : Ct;
    return t
      ? "#" +
          e(t.r) +
          e(t.g) +
          e(t.b) +
          ((t, e) => (t < 255 ? e(t) : ""))(t.a, e)
      : void 0;
  }
  const Tt =
    /^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;
  function Lt(t, e, i) {
    const s = e * Math.min(i, 1 - i),
      n = (e, n = (e + t / 30) % 12) =>
        i - s * Math.max(Math.min(n - 3, 9 - n, 1), -1);
    return [n(0), n(8), n(4)];
  }
  function Et(t, e, i) {
    const s = (s, n = (s + t / 60) % 6) =>
      i - i * e * Math.max(Math.min(n, 4 - n, 1), 0);
    return [s(5), s(3), s(1)];
  }
  function Rt(t, e, i) {
    const s = Lt(t, 1, 0.5);
    let n;
    for (
      e + i > 1 && ((n = 1 / (e + i)), (e *= n), (i *= n)), n = 0;
      n < 3;
      n++
    )
      (s[n] *= 1 - e - i), (s[n] += e);
    return s;
  }
  function It(t) {
    const e = t.r / 255,
      i = t.g / 255,
      s = t.b / 255,
      n = Math.max(e, i, s),
      o = Math.min(e, i, s),
      a = (n + o) / 2;
    let r, l, h;
    return (
      n !== o &&
        ((h = n - o),
        (l = a > 0.5 ? h / (2 - n - o) : h / (n + o)),
        (r = (function (t, e, i, s, n) {
          return t === n
            ? (e - i) / s + (e < i ? 6 : 0)
            : e === n
            ? (i - t) / s + 2
            : (t - e) / s + 4;
        })(e, i, s, h, n)),
        (r = 60 * r + 0.5)),
      [0 | r, l || 0, a]
    );
  }
  function zt(t, e, i, s) {
    return (Array.isArray(e) ? t(e[0], e[1], e[2]) : t(e, i, s)).map(Mt);
  }
  function Ft(t, e, i) {
    return zt(Lt, t, e, i);
  }
  function Vt(t) {
    return ((t % 360) + 360) % 360;
  }
  function Bt(t) {
    const e = Tt.exec(t);
    let i,
      s = 255;
    if (!e) return;
    e[5] !== i && (s = e[6] ? vt(+e[5]) : Mt(+e[5]));
    const n = Vt(+e[2]),
      o = +e[3] / 100,
      a = +e[4] / 100;
    return (
      (i =
        "hwb" === e[1]
          ? (function (t, e, i) {
              return zt(Rt, t, e, i);
            })(n, o, a)
          : "hsv" === e[1]
          ? (function (t, e, i) {
              return zt(Et, t, e, i);
            })(n, o, a)
          : Ft(n, o, a)),
      { r: i[0], g: i[1], b: i[2], a: s }
    );
  }
  const Wt = {
      x: "dark",
      Z: "light",
      Y: "re",
      X: "blu",
      W: "gr",
      V: "medium",
      U: "slate",
      A: "ee",
      T: "ol",
      S: "or",
      B: "ra",
      C: "lateg",
      D: "ights",
      R: "in",
      Q: "turquois",
      E: "hi",
      P: "ro",
      O: "al",
      N: "le",
      M: "de",
      L: "yello",
      F: "en",
      K: "ch",
      G: "arks",
      H: "ea",
      I: "ightg",
      J: "wh",
    },
    Nt = {
      OiceXe: "f0f8ff",
      antiquewEte: "faebd7",
      aqua: "ffff",
      aquamarRe: "7fffd4",
      azuY: "f0ffff",
      beige: "f5f5dc",
      bisque: "ffe4c4",
      black: "0",
      blanKedOmond: "ffebcd",
      Xe: "ff",
      XeviTet: "8a2be2",
      bPwn: "a52a2a",
      burlywood: "deb887",
      caMtXe: "5f9ea0",
      KartYuse: "7fff00",
      KocTate: "d2691e",
      cSO: "ff7f50",
      cSnflowerXe: "6495ed",
      cSnsilk: "fff8dc",
      crimson: "dc143c",
      cyan: "ffff",
      xXe: "8b",
      xcyan: "8b8b",
      xgTMnPd: "b8860b",
      xWay: "a9a9a9",
      xgYF: "6400",
      xgYy: "a9a9a9",
      xkhaki: "bdb76b",
      xmagFta: "8b008b",
      xTivegYF: "556b2f",
      xSange: "ff8c00",
      xScEd: "9932cc",
      xYd: "8b0000",
      xsOmon: "e9967a",
      xsHgYF: "8fbc8f",
      xUXe: "483d8b",
      xUWay: "2f4f4f",
      xUgYy: "2f4f4f",
      xQe: "ced1",
      xviTet: "9400d3",
      dAppRk: "ff1493",
      dApskyXe: "bfff",
      dimWay: "696969",
      dimgYy: "696969",
      dodgerXe: "1e90ff",
      fiYbrick: "b22222",
      flSOwEte: "fffaf0",
      foYstWAn: "228b22",
      fuKsia: "ff00ff",
      gaRsbSo: "dcdcdc",
      ghostwEte: "f8f8ff",
      gTd: "ffd700",
      gTMnPd: "daa520",
      Way: "808080",
      gYF: "8000",
      gYFLw: "adff2f",
      gYy: "808080",
      honeyMw: "f0fff0",
      hotpRk: "ff69b4",
      RdianYd: "cd5c5c",
      Rdigo: "4b0082",
      ivSy: "fffff0",
      khaki: "f0e68c",
      lavFMr: "e6e6fa",
      lavFMrXsh: "fff0f5",
      lawngYF: "7cfc00",
      NmoncEffon: "fffacd",
      ZXe: "add8e6",
      ZcSO: "f08080",
      Zcyan: "e0ffff",
      ZgTMnPdLw: "fafad2",
      ZWay: "d3d3d3",
      ZgYF: "90ee90",
      ZgYy: "d3d3d3",
      ZpRk: "ffb6c1",
      ZsOmon: "ffa07a",
      ZsHgYF: "20b2aa",
      ZskyXe: "87cefa",
      ZUWay: "778899",
      ZUgYy: "778899",
      ZstAlXe: "b0c4de",
      ZLw: "ffffe0",
      lime: "ff00",
      limegYF: "32cd32",
      lRF: "faf0e6",
      magFta: "ff00ff",
      maPon: "800000",
      VaquamarRe: "66cdaa",
      VXe: "cd",
      VScEd: "ba55d3",
      VpurpN: "9370db",
      VsHgYF: "3cb371",
      VUXe: "7b68ee",
      VsprRggYF: "fa9a",
      VQe: "48d1cc",
      VviTetYd: "c71585",
      midnightXe: "191970",
      mRtcYam: "f5fffa",
      mistyPse: "ffe4e1",
      moccasR: "ffe4b5",
      navajowEte: "ffdead",
      navy: "80",
      Tdlace: "fdf5e6",
      Tive: "808000",
      TivedBb: "6b8e23",
      Sange: "ffa500",
      SangeYd: "ff4500",
      ScEd: "da70d6",
      pOegTMnPd: "eee8aa",
      pOegYF: "98fb98",
      pOeQe: "afeeee",
      pOeviTetYd: "db7093",
      papayawEp: "ffefd5",
      pHKpuff: "ffdab9",
      peru: "cd853f",
      pRk: "ffc0cb",
      plum: "dda0dd",
      powMrXe: "b0e0e6",
      purpN: "800080",
      YbeccapurpN: "663399",
      Yd: "ff0000",
      Psybrown: "bc8f8f",
      PyOXe: "4169e1",
      saddNbPwn: "8b4513",
      sOmon: "fa8072",
      sandybPwn: "f4a460",
      sHgYF: "2e8b57",
      sHshell: "fff5ee",
      siFna: "a0522d",
      silver: "c0c0c0",
      skyXe: "87ceeb",
      UXe: "6a5acd",
      UWay: "708090",
      UgYy: "708090",
      snow: "fffafa",
      sprRggYF: "ff7f",
      stAlXe: "4682b4",
      tan: "d2b48c",
      teO: "8080",
      tEstN: "d8bfd8",
      tomato: "ff6347",
      Qe: "40e0d0",
      viTet: "ee82ee",
      JHt: "f5deb3",
      wEte: "ffffff",
      wEtesmoke: "f5f5f5",
      Lw: "ffff00",
      LwgYF: "9acd32",
    };
  let Ht;
  function jt(t) {
    Ht ||
      ((Ht = (function () {
        const t = {},
          e = Object.keys(Nt),
          i = Object.keys(Wt);
        let s, n, o, a, r;
        for (s = 0; s < e.length; s++) {
          for (a = r = e[s], n = 0; n < i.length; n++)
            (o = i[n]), (r = r.replace(o, Wt[o]));
          (o = parseInt(Nt[a], 16)),
            (t[r] = [(o >> 16) & 255, (o >> 8) & 255, 255 & o]);
        }
        return t;
      })()),
      (Ht.transparent = [0, 0, 0, 0]));
    const e = Ht[t.toLowerCase()];
    return e && { r: e[0], g: e[1], b: e[2], a: 4 === e.length ? e[3] : 255 };
  }
  const $t =
    /^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;
  const Yt = (t) =>
      t <= 0.0031308 ? 12.92 * t : 1.055 * Math.pow(t, 1 / 2.4) - 0.055,
    Ut = (t) => (t <= 0.04045 ? t / 12.92 : Math.pow((t + 0.055) / 1.055, 2.4));
  function Xt(t, e, i) {
    if (t) {
      let s = It(t);
      (s[e] = Math.max(0, Math.min(s[e] + s[e] * i, 0 === e ? 360 : 1))),
        (s = Ft(s)),
        (t.r = s[0]),
        (t.g = s[1]),
        (t.b = s[2]);
    }
  }
  function qt(t, e) {
    return t ? Object.assign(e || {}, t) : t;
  }
  function Kt(t) {
    var e = { r: 0, g: 0, b: 0, a: 255 };
    return (
      Array.isArray(t)
        ? t.length >= 3 &&
          ((e = { r: t[0], g: t[1], b: t[2], a: 255 }),
          t.length > 3 && (e.a = Mt(t[3])))
        : ((e = qt(t, { r: 0, g: 0, b: 0, a: 1 })).a = Mt(e.a)),
      e
    );
  }
  function Gt(t) {
    return "r" === t.charAt(0)
      ? (function (t) {
          const e = $t.exec(t);
          let i,
            s,
            n,
            o = 255;
          if (e) {
            if (e[7] !== i) {
              const t = +e[7];
              o = e[8] ? vt(t) : yt(255 * t, 0, 255);
            }
            return (
              (i = +e[1]),
              (s = +e[3]),
              (n = +e[5]),
              (i = 255 & (e[2] ? vt(i) : yt(i, 0, 255))),
              (s = 255 & (e[4] ? vt(s) : yt(s, 0, 255))),
              (n = 255 & (e[6] ? vt(n) : yt(n, 0, 255))),
              { r: i, g: s, b: n, a: o }
            );
          }
        })(t)
      : Bt(t);
  }
  class Zt {
    constructor(t) {
      if (t instanceof Zt) return t;
      const e = typeof t;
      let i;
      var s, n, o;
      "object" === e
        ? (i = Kt(t))
        : "string" === e &&
          ((o = (s = t).length),
          "#" === s[0] &&
            (4 === o || 5 === o
              ? (n = {
                  r: 255 & (17 * St[s[1]]),
                  g: 255 & (17 * St[s[2]]),
                  b: 255 & (17 * St[s[3]]),
                  a: 5 === o ? 17 * St[s[4]] : 255,
                })
              : (7 !== o && 9 !== o) ||
                (n = {
                  r: (St[s[1]] << 4) | St[s[2]],
                  g: (St[s[3]] << 4) | St[s[4]],
                  b: (St[s[5]] << 4) | St[s[6]],
                  a: 9 === o ? (St[s[7]] << 4) | St[s[8]] : 255,
                })),
          (i = n || jt(t) || Gt(t))),
        (this._rgb = i),
        (this._valid = !!i);
    }
    get valid() {
      return this._valid;
    }
    get rgb() {
      var t = qt(this._rgb);
      return t && (t.a = wt(t.a)), t;
    }
    set rgb(t) {
      this._rgb = Kt(t);
    }
    rgbString() {
      return this._valid
        ? (t = this._rgb) &&
            (t.a < 255
              ? `rgba(${t.r}, ${t.g}, ${t.b}, ${wt(t.a)})`
              : `rgb(${t.r}, ${t.g}, ${t.b})`)
        : void 0;
      var t;
    }
    hexString() {
      return this._valid ? At(this._rgb) : void 0;
    }
    hslString() {
      return this._valid
        ? (function (t) {
            if (!t) return;
            const e = It(t),
              i = e[0],
              s = kt(e[1]),
              n = kt(e[2]);
            return t.a < 255
              ? `hsla(${i}, ${s}%, ${n}%, ${wt(t.a)})`
              : `hsl(${i}, ${s}%, ${n}%)`;
          })(this._rgb)
        : void 0;
    }
    mix(t, e) {
      if (t) {
        const i = this.rgb,
          s = t.rgb;
        let n;
        const o = e === n ? 0.5 : e,
          a = 2 * o - 1,
          r = i.a - s.a,
          l = ((a * r == -1 ? a : (a + r) / (1 + a * r)) + 1) / 2;
        (n = 1 - l),
          (i.r = 255 & (l * i.r + n * s.r + 0.5)),
          (i.g = 255 & (l * i.g + n * s.g + 0.5)),
          (i.b = 255 & (l * i.b + n * s.b + 0.5)),
          (i.a = o * i.a + (1 - o) * s.a),
          (this.rgb = i);
      }
      return this;
    }
    interpolate(t, e) {
      return (
        t &&
          (this._rgb = (function (t, e, i) {
            const s = Ut(wt(t.r)),
              n = Ut(wt(t.g)),
              o = Ut(wt(t.b));
            return {
              r: Mt(Yt(s + i * (Ut(wt(e.r)) - s))),
              g: Mt(Yt(n + i * (Ut(wt(e.g)) - n))),
              b: Mt(Yt(o + i * (Ut(wt(e.b)) - o))),
              a: t.a + i * (e.a - t.a),
            };
          })(this._rgb, t._rgb, e)),
        this
      );
    }
    clone() {
      return new Zt(this.rgb);
    }
    alpha(t) {
      return (this._rgb.a = Mt(t)), this;
    }
    clearer(t) {
      return (this._rgb.a *= 1 - t), this;
    }
    greyscale() {
      const t = this._rgb,
        e = _t(0.3 * t.r + 0.59 * t.g + 0.11 * t.b);
      return (t.r = t.g = t.b = e), this;
    }
    opaquer(t) {
      return (this._rgb.a *= 1 + t), this;
    }
    negate() {
      const t = this._rgb;
      return (t.r = 255 - t.r), (t.g = 255 - t.g), (t.b = 255 - t.b), this;
    }
    lighten(t) {
      return Xt(this._rgb, 2, t), this;
    }
    darken(t) {
      return Xt(this._rgb, 2, -t), this;
    }
    saturate(t) {
      return Xt(this._rgb, 1, t), this;
    }
    desaturate(t) {
      return Xt(this._rgb, 1, -t), this;
    }
    rotate(t) {
      return (
        (function (t, e) {
          var i = It(t);
          (i[0] = Vt(i[0] + e)),
            (i = Ft(i)),
            (t.r = i[0]),
            (t.g = i[1]),
            (t.b = i[2]);
        })(this._rgb, t),
        this
      );
    }
  }
  function Jt(t) {
    if (t && "object" == typeof t) {
      const e = t.toString();
      return "[object CanvasPattern]" === e || "[object CanvasGradient]" === e;
    }
    return !1;
  }
  function Qt(t) {
    return Jt(t) ? t : new Zt(t);
  }
  function te(t) {
    return Jt(t) ? t : new Zt(t).saturate(0.5).darken(0.1).hexString();
  }
  const ee = ["x", "y", "borderWidth", "radius", "tension"],
    ie = ["color", "borderColor", "backgroundColor"];
  const se = new Map();
  function ne(t, e, i) {
    return (function (t, e) {
      e = e || {};
      const i = t + JSON.stringify(e);
      let s = se.get(i);
      return s || ((s = new Intl.NumberFormat(t, e)), se.set(i, s)), s;
    })(e, i).format(t);
  }
  const oe = {
    values: (t) => (n(t) ? t : "" + t),
    numeric(t, e, i) {
      if (0 === t) return "0";
      const s = this.chart.options.locale;
      let n,
        o = t;
      if (i.length > 1) {
        const e = Math.max(
          Math.abs(i[0].value),
          Math.abs(i[i.length - 1].value)
        );
        (e < 1e-4 || e > 1e15) && (n = "scientific"),
          (o = (function (t, e) {
            let i =
              e.length > 3 ? e[2].value - e[1].value : e[1].value - e[0].value;
            Math.abs(i) >= 1 && t !== Math.floor(t) && (i = t - Math.floor(t));
            return i;
          })(t, i));
      }
      const a = z(Math.abs(o)),
        r = isNaN(a) ? 1 : Math.max(Math.min(-1 * Math.floor(a), 20), 0),
        l = { notation: n, minimumFractionDigits: r, maximumFractionDigits: r };
      return Object.assign(l, this.options.ticks.format), ne(t, s, l);
    },
    logarithmic(t, e, i) {
      if (0 === t) return "0";
      const s = i[e].significand || t / Math.pow(10, Math.floor(z(t)));
      return [1, 2, 3, 5, 10, 15].includes(s) || e > 0.8 * i.length
        ? oe.numeric.call(this, t, e, i)
        : "";
    },
  };
  var ae = { formatters: oe };
  const re = Object.create(null),
    le = Object.create(null);
  function he(t, e) {
    if (!e) return t;
    const i = e.split(".");
    for (let e = 0, s = i.length; e < s; ++e) {
      const s = i[e];
      t = t[s] || (t[s] = Object.create(null));
    }
    return t;
  }
  function ce(t, e, i) {
    return "string" == typeof e ? x(he(t, e), i) : x(he(t, ""), e);
  }
  class de {
    constructor(t, e) {
      (this.animation = void 0),
        (this.backgroundColor = "rgba(0,0,0,0.1)"),
        (this.borderColor = "rgba(0,0,0,0.1)"),
        (this.color = "#666"),
        (this.datasets = {}),
        (this.devicePixelRatio = (t) => t.chart.platform.getDevicePixelRatio()),
        (this.elements = {}),
        (this.events = [
          "mousemove",
          "mouseout",
          "click",
          "touchstart",
          "touchmove",
        ]),
        (this.font = {
          family: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",
          size: 12,
          style: "normal",
          lineHeight: 1.2,
          weight: null,
        }),
        (this.hover = {}),
        (this.hoverBackgroundColor = (t, e) => te(e.backgroundColor)),
        (this.hoverBorderColor = (t, e) => te(e.borderColor)),
        (this.hoverColor = (t, e) => te(e.color)),
        (this.indexAxis = "x"),
        (this.interaction = {
          mode: "nearest",
          intersect: !0,
          includeInvisible: !1,
        }),
        (this.maintainAspectRatio = !0),
        (this.onHover = null),
        (this.onClick = null),
        (this.parsing = !0),
        (this.plugins = {}),
        (this.responsive = !0),
        (this.scale = void 0),
        (this.scales = {}),
        (this.showLine = !0),
        (this.drawActiveElementsOnTop = !0),
        this.describe(t),
        this.apply(e);
    }
    set(t, e) {
      return ce(this, t, e);
    }
    get(t) {
      return he(this, t);
    }
    describe(t, e) {
      return ce(le, t, e);
    }
    override(t, e) {
      return ce(re, t, e);
    }
    route(t, e, i, s) {
      const n = he(this, t),
        a = he(this, i),
        r = "_" + e;
      Object.defineProperties(n, {
        [r]: { value: n[e], writable: !0 },
        [e]: {
          enumerable: !0,
          get() {
            const t = this[r],
              e = a[s];
            return o(t) ? Object.assign({}, e, t) : l(t, e);
          },
          set(t) {
            this[r] = t;
          },
        },
      });
    }
    apply(t) {
      t.forEach((t) => t(this));
    }
  }
  var ue = new de(
    {
      _scriptable: (t) => !t.startsWith("on"),
      _indexable: (t) => "events" !== t,
      hover: { _fallback: "interaction" },
      interaction: { _scriptable: !1, _indexable: !1 },
    },
    [
      function (t) {
        t.set("animation", {
          delay: void 0,
          duration: 1e3,
          easing: "easeOutQuart",
          fn: void 0,
          from: void 0,
          loop: void 0,
          to: void 0,
          type: void 0,
        }),
          t.describe("animation", {
            _fallback: !1,
            _indexable: !1,
            _scriptable: (t) =>
              "onProgress" !== t && "onComplete" !== t && "fn" !== t,
          }),
          t.set("animations", {
            colors: { type: "color", properties: ie },
            numbers: { type: "number", properties: ee },
          }),
          t.describe("animations", { _fallback: "animation" }),
          t.set("transitions", {
            active: { animation: { duration: 400 } },
            resize: { animation: { duration: 0 } },
            show: {
              animations: {
                colors: { from: "transparent" },
                visible: { type: "boolean", duration: 0 },
              },
            },
            hide: {
              animations: {
                colors: { to: "transparent" },
                visible: {
                  type: "boolean",
                  easing: "linear",
                  fn: (t) => 0 | t,
                },
              },
            },
          });
      },
      function (t) {
        t.set("layout", {
          autoPadding: !0,
          padding: { top: 0, right: 0, bottom: 0, left: 0 },
        });
      },
      function (t) {
        t.set("scale", {
          display: !0,
          offset: !1,
          reverse: !1,
          beginAtZero: !1,
          bounds: "ticks",
          clip: !0,
          grace: 0,
          grid: {
            display: !0,
            lineWidth: 1,
            drawOnChartArea: !0,
            drawTicks: !0,
            tickLength: 8,
            tickWidth: (t, e) => e.lineWidth,
            tickColor: (t, e) => e.color,
            offset: !1,
          },
          border: { display: !0, dash: [], dashOffset: 0, width: 1 },
          title: { display: !1, text: "", padding: { top: 4, bottom: 4 } },
          ticks: {
            minRotation: 0,
            maxRotation: 50,
            mirror: !1,
            textStrokeWidth: 0,
            textStrokeColor: "",
            padding: 3,
            display: !0,
            autoSkip: !0,
            autoSkipPadding: 3,
            labelOffset: 0,
            callback: ae.formatters.values,
            minor: {},
            major: {},
            align: "center",
            crossAlign: "near",
            showLabelBackdrop: !1,
            backdropColor: "rgba(255, 255, 255, 0.75)",
            backdropPadding: 2,
          },
        }),
          t.route("scale.ticks", "color", "", "color"),
          t.route("scale.grid", "color", "", "borderColor"),
          t.route("scale.border", "color", "", "borderColor"),
          t.route("scale.title", "color", "", "color"),
          t.describe("scale", {
            _fallback: !1,
            _scriptable: (t) =>
              !t.startsWith("before") &&
              !t.startsWith("after") &&
              "callback" !== t &&
              "parser" !== t,
            _indexable: (t) =>
              "borderDash" !== t && "tickBorderDash" !== t && "dash" !== t,
          }),
          t.describe("scales", { _fallback: "scale" }),
          t.describe("scale.ticks", {
            _scriptable: (t) => "backdropPadding" !== t && "callback" !== t,
            _indexable: (t) => "backdropPadding" !== t,
          });
      },
    ]
  );
  function fe() {
    return "undefined" != typeof window && "undefined" != typeof document;
  }
  function ge(t) {
    let e = t.parentNode;
    return e && "[object ShadowRoot]" === e.toString() && (e = e.host), e;
  }
  function pe(t, e, i) {
    let s;
    return (
      "string" == typeof t
        ? ((s = parseInt(t, 10)),
          -1 !== t.indexOf("%") && (s = (s / 100) * e.parentNode[i]))
        : (s = t),
      s
    );
  }
  const me = (t) => t.ownerDocument.defaultView.getComputedStyle(t, null);
  function xe(t, e) {
    return me(t).getPropertyValue(e);
  }
  const be = ["top", "right", "bottom", "left"];
  function _e(t, e, i) {
    const s = {};
    i = i ? "-" + i : "";
    for (let n = 0; n < 4; n++) {
      const o = be[n];
      s[o] = parseFloat(t[e + "-" + o + i]) || 0;
    }
    return (s.width = s.left + s.right), (s.height = s.top + s.bottom), s;
  }
  const ye = (t, e, i) => (t > 0 || e > 0) && (!i || !i.shadowRoot);
  function ve(t, e) {
    if ("native" in t) return t;
    const { canvas: i, currentDevicePixelRatio: s } = e,
      n = me(i),
      o = "border-box" === n.boxSizing,
      a = _e(n, "padding"),
      r = _e(n, "border", "width"),
      {
        x: l,
        y: h,
        box: c,
      } = (function (t, e) {
        const i = t.touches,
          s = i && i.length ? i[0] : t,
          { offsetX: n, offsetY: o } = s;
        let a,
          r,
          l = !1;
        if (ye(n, o, t.target)) (a = n), (r = o);
        else {
          const t = e.getBoundingClientRect();
          (a = s.clientX - t.left), (r = s.clientY - t.top), (l = !0);
        }
        return { x: a, y: r, box: l };
      })(t, i),
      d = a.left + (c && r.left),
      u = a.top + (c && r.top);
    let { width: f, height: g } = e;
    return (
      o && ((f -= a.width + r.width), (g -= a.height + r.height)),
      {
        x: Math.round((((l - d) / f) * i.width) / s),
        y: Math.round((((h - u) / g) * i.height) / s),
      }
    );
  }
  const Me = (t) => Math.round(10 * t) / 10;
  function we(t, e, i, s) {
    const n = me(t),
      o = _e(n, "margin"),
      a = pe(n.maxWidth, t, "clientWidth") || T,
      r = pe(n.maxHeight, t, "clientHeight") || T,
      l = (function (t, e, i) {
        let s, n;
        if (void 0 === e || void 0 === i) {
          const o = t && ge(t);
          if (o) {
            const t = o.getBoundingClientRect(),
              a = me(o),
              r = _e(a, "border", "width"),
              l = _e(a, "padding");
            (e = t.width - l.width - r.width),
              (i = t.height - l.height - r.height),
              (s = pe(a.maxWidth, o, "clientWidth")),
              (n = pe(a.maxHeight, o, "clientHeight"));
          } else (e = t.clientWidth), (i = t.clientHeight);
        }
        return { width: e, height: i, maxWidth: s || T, maxHeight: n || T };
      })(t, e, i);
    let { width: h, height: c } = l;
    if ("content-box" === n.boxSizing) {
      const t = _e(n, "border", "width"),
        e = _e(n, "padding");
      (h -= e.width + t.width), (c -= e.height + t.height);
    }
    (h = Math.max(0, h - o.width)),
      (c = Math.max(0, s ? h / s : c - o.height)),
      (h = Me(Math.min(h, a, l.maxWidth))),
      (c = Me(Math.min(c, r, l.maxHeight))),
      h && !c && (c = Me(h / 2));
    return (
      (void 0 !== e || void 0 !== i) &&
        s &&
        l.height &&
        c > l.height &&
        ((c = l.height), (h = Me(Math.floor(c * s)))),
      { width: h, height: c }
    );
  }
  function ke(t, e, i) {
    const s = e || 1,
      n = Math.floor(t.height * s),
      o = Math.floor(t.width * s);
    (t.height = Math.floor(t.height)), (t.width = Math.floor(t.width));
    const a = t.canvas;
    return (
      a.style &&
        (i || (!a.style.height && !a.style.width)) &&
        ((a.style.height = `${t.height}px`), (a.style.width = `${t.width}px`)),
      (t.currentDevicePixelRatio !== s || a.height !== n || a.width !== o) &&
        ((t.currentDevicePixelRatio = s),
        (a.height = n),
        (a.width = o),
        t.ctx.setTransform(s, 0, 0, s, 0, 0),
        !0)
    );
  }
  const Se = (function () {
    let t = !1;
    try {
      const e = {
        get passive() {
          return (t = !0), !1;
        },
      };
      fe() &&
        (window.addEventListener("test", null, e),
        window.removeEventListener("test", null, e));
    } catch (t) {}
    return t;
  })();
  function Pe(t, e) {
    const i = xe(t, e),
      s = i && i.match(/^(\d+)(\.\d+)?px$/);
    return s ? +s[1] : void 0;
  }
  function De(t) {
    return !t || s(t.size) || s(t.family)
      ? null
      : (t.style ? t.style + " " : "") +
          (t.weight ? t.weight + " " : "") +
          t.size +
          "px " +
          t.family;
  }
  function Ce(t, e, i, s, n) {
    let o = e[n];
    return (
      o || ((o = e[n] = t.measureText(n).width), i.push(n)), o > s && (s = o), s
    );
  }
  function Oe(t, e, i, s) {
    let o = ((s = s || {}).data = s.data || {}),
      a = (s.garbageCollect = s.garbageCollect || []);
    s.font !== e &&
      ((o = s.data = {}), (a = s.garbageCollect = []), (s.font = e)),
      t.save(),
      (t.font = e);
    let r = 0;
    const l = i.length;
    let h, c, d, u, f;
    for (h = 0; h < l; h++)
      if (((u = i[h]), null == u || n(u))) {
        if (n(u))
          for (c = 0, d = u.length; c < d; c++)
            (f = u[c]), null == f || n(f) || (r = Ce(t, o, a, r, f));
      } else r = Ce(t, o, a, r, u);
    t.restore();
    const g = a.length / 2;
    if (g > i.length) {
      for (h = 0; h < g; h++) delete o[a[h]];
      a.splice(0, g);
    }
    return r;
  }
  function Ae(t, e, i) {
    const s = t.currentDevicePixelRatio,
      n = 0 !== i ? Math.max(i / 2, 0.5) : 0;
    return Math.round((e - n) * s) / s + n;
  }
  function Te(t, e) {
    (e || t) &&
      ((e = e || t.getContext("2d")).save(),
      e.resetTransform(),
      e.clearRect(0, 0, t.width, t.height),
      e.restore());
  }
  function Le(t, e, i, s) {
    Ee(t, e, i, s, null);
  }
  function Ee(t, e, i, s, n) {
    let o, a, r, l, h, c, d, u;
    const f = e.pointStyle,
      g = e.rotation,
      p = e.radius;
    let m = (g || 0) * L;
    if (
      f &&
      "object" == typeof f &&
      ((o = f.toString()),
      "[object HTMLImageElement]" === o || "[object HTMLCanvasElement]" === o)
    )
      return (
        t.save(),
        t.translate(i, s),
        t.rotate(m),
        t.drawImage(f, -f.width / 2, -f.height / 2, f.width, f.height),
        void t.restore()
      );
    if (!(isNaN(p) || p <= 0)) {
      switch ((t.beginPath(), f)) {
        default:
          n ? t.ellipse(i, s, n / 2, p, 0, 0, O) : t.arc(i, s, p, 0, O),
            t.closePath();
          break;
        case "triangle":
          (c = n ? n / 2 : p),
            t.moveTo(i + Math.sin(m) * c, s - Math.cos(m) * p),
            (m += I),
            t.lineTo(i + Math.sin(m) * c, s - Math.cos(m) * p),
            (m += I),
            t.lineTo(i + Math.sin(m) * c, s - Math.cos(m) * p),
            t.closePath();
          break;
        case "rectRounded":
          (h = 0.516 * p),
            (l = p - h),
            (a = Math.cos(m + R) * l),
            (d = Math.cos(m + R) * (n ? n / 2 - h : l)),
            (r = Math.sin(m + R) * l),
            (u = Math.sin(m + R) * (n ? n / 2 - h : l)),
            t.arc(i - d, s - r, h, m - C, m - E),
            t.arc(i + u, s - a, h, m - E, m),
            t.arc(i + d, s + r, h, m, m + E),
            t.arc(i - u, s + a, h, m + E, m + C),
            t.closePath();
          break;
        case "rect":
          if (!g) {
            (l = Math.SQRT1_2 * p),
              (c = n ? n / 2 : l),
              t.rect(i - c, s - l, 2 * c, 2 * l);
            break;
          }
          m += R;
        case "rectRot":
          (d = Math.cos(m) * (n ? n / 2 : p)),
            (a = Math.cos(m) * p),
            (r = Math.sin(m) * p),
            (u = Math.sin(m) * (n ? n / 2 : p)),
            t.moveTo(i - d, s - r),
            t.lineTo(i + u, s - a),
            t.lineTo(i + d, s + r),
            t.lineTo(i - u, s + a),
            t.closePath();
          break;
        case "crossRot":
          m += R;
        case "cross":
          (d = Math.cos(m) * (n ? n / 2 : p)),
            (a = Math.cos(m) * p),
            (r = Math.sin(m) * p),
            (u = Math.sin(m) * (n ? n / 2 : p)),
            t.moveTo(i - d, s - r),
            t.lineTo(i + d, s + r),
            t.moveTo(i + u, s - a),
            t.lineTo(i - u, s + a);
          break;
        case "star":
          (d = Math.cos(m) * (n ? n / 2 : p)),
            (a = Math.cos(m) * p),
            (r = Math.sin(m) * p),
            (u = Math.sin(m) * (n ? n / 2 : p)),
            t.moveTo(i - d, s - r),
            t.lineTo(i + d, s + r),
            t.moveTo(i + u, s - a),
            t.lineTo(i - u, s + a),
            (m += R),
            (d = Math.cos(m) * (n ? n / 2 : p)),
            (a = Math.cos(m) * p),
            (r = Math.sin(m) * p),
            (u = Math.sin(m) * (n ? n / 2 : p)),
            t.moveTo(i - d, s - r),
            t.lineTo(i + d, s + r),
            t.moveTo(i + u, s - a),
            t.lineTo(i - u, s + a);
          break;
        case "line":
          (a = n ? n / 2 : Math.cos(m) * p),
            (r = Math.sin(m) * p),
            t.moveTo(i - a, s - r),
            t.lineTo(i + a, s + r);
          break;
        case "dash":
          t.moveTo(i, s),
            t.lineTo(i + Math.cos(m) * (n ? n / 2 : p), s + Math.sin(m) * p);
          break;
        case !1:
          t.closePath();
      }
      t.fill(), e.borderWidth > 0 && t.stroke();
    }
  }
  function Re(t, e, i) {
    return (
      (i = i || 0.5),
      !e ||
        (t &&
          t.x > e.left - i &&
          t.x < e.right + i &&
          t.y > e.top - i &&
          t.y < e.bottom + i)
    );
  }
  function Ie(t, e) {
    t.save(),
      t.beginPath(),
      t.rect(e.left, e.top, e.right - e.left, e.bottom - e.top),
      t.clip();
  }
  function ze(t) {
    t.restore();
  }
  function Fe(t, e, i, s, n) {
    if (!e) return t.lineTo(i.x, i.y);
    if ("middle" === n) {
      const s = (e.x + i.x) / 2;
      t.lineTo(s, e.y), t.lineTo(s, i.y);
    } else ("after" === n) != !!s ? t.lineTo(e.x, i.y) : t.lineTo(i.x, e.y);
    t.lineTo(i.x, i.y);
  }
  function Ve(t, e, i, s) {
    if (!e) return t.lineTo(i.x, i.y);
    t.bezierCurveTo(
      s ? e.cp1x : e.cp2x,
      s ? e.cp1y : e.cp2y,
      s ? i.cp2x : i.cp1x,
      s ? i.cp2y : i.cp1y,
      i.x,
      i.y
    );
  }
  function Be(t, e, i, s, n) {
    if (n.strikethrough || n.underline) {
      const o = t.measureText(s),
        a = e - o.actualBoundingBoxLeft,
        r = e + o.actualBoundingBoxRight,
        l = i - o.actualBoundingBoxAscent,
        h = i + o.actualBoundingBoxDescent,
        c = n.strikethrough ? (l + h) / 2 : h;
      (t.strokeStyle = t.fillStyle),
        t.beginPath(),
        (t.lineWidth = n.decorationWidth || 2),
        t.moveTo(a, c),
        t.lineTo(r, c),
        t.stroke();
    }
  }
  function We(t, e) {
    const i = t.fillStyle;
    (t.fillStyle = e.color),
      t.fillRect(e.left, e.top, e.width, e.height),
      (t.fillStyle = i);
  }
  function Ne(t, e, i, o, a, r = {}) {
    const l = n(e) ? e : [e],
      h = r.strokeWidth > 0 && "" !== r.strokeColor;
    let c, d;
    for (
      t.save(),
        t.font = a.string,
        (function (t, e) {
          e.translation && t.translate(e.translation[0], e.translation[1]),
            s(e.rotation) || t.rotate(e.rotation),
            e.color && (t.fillStyle = e.color),
            e.textAlign && (t.textAlign = e.textAlign),
            e.textBaseline && (t.textBaseline = e.textBaseline);
        })(t, r),
        c = 0;
      c < l.length;
      ++c
    )
      (d = l[c]),
        r.backdrop && We(t, r.backdrop),
        h &&
          (r.strokeColor && (t.strokeStyle = r.strokeColor),
          s(r.strokeWidth) || (t.lineWidth = r.strokeWidth),
          t.strokeText(d, i, o, r.maxWidth)),
        t.fillText(d, i, o, r.maxWidth),
        Be(t, i, o, d, r),
        (o += Number(a.lineHeight));
    t.restore();
  }
  function He(t, e) {
    const { x: i, y: s, w: n, h: o, radius: a } = e;
    t.arc(i + a.topLeft, s + a.topLeft, a.topLeft, 1.5 * C, C, !0),
      t.lineTo(i, s + o - a.bottomLeft),
      t.arc(i + a.bottomLeft, s + o - a.bottomLeft, a.bottomLeft, C, E, !0),
      t.lineTo(i + n - a.bottomRight, s + o),
      t.arc(
        i + n - a.bottomRight,
        s + o - a.bottomRight,
        a.bottomRight,
        E,
        0,
        !0
      ),
      t.lineTo(i + n, s + a.topRight),
      t.arc(i + n - a.topRight, s + a.topRight, a.topRight, 0, -E, !0),
      t.lineTo(i + a.topLeft, s);
  }
  function je(t, e = [""], i, s, n = () => t[0]) {
    const o = i || t;
    void 0 === s && (s = ti("_fallback", t));
    const a = {
      [Symbol.toStringTag]: "Object",
      _cacheable: !0,
      _scopes: t,
      _rootScopes: o,
      _fallback: s,
      _getTarget: n,
      override: (i) => je([i, ...t], e, o, s),
    };
    return new Proxy(a, {
      deleteProperty: (e, i) => (
        delete e[i], delete e._keys, delete t[0][i], !0
      ),
      get: (i, s) =>
        qe(i, s, () =>
          (function (t, e, i, s) {
            let n;
            for (const o of e)
              if (((n = ti(Ue(o, t), i)), void 0 !== n))
                return Xe(t, n) ? Je(i, s, t, n) : n;
          })(s, e, t, i)
        ),
      getOwnPropertyDescriptor: (t, e) =>
        Reflect.getOwnPropertyDescriptor(t._scopes[0], e),
      getPrototypeOf: () => Reflect.getPrototypeOf(t[0]),
      has: (t, e) => ei(t).includes(e),
      ownKeys: (t) => ei(t),
      set(t, e, i) {
        const s = t._storage || (t._storage = n());
        return (t[e] = s[e] = i), delete t._keys, !0;
      },
    });
  }
  function $e(t, e, i, s) {
    const a = {
      _cacheable: !1,
      _proxy: t,
      _context: e,
      _subProxy: i,
      _stack: new Set(),
      _descriptors: Ye(t, s),
      setContext: (e) => $e(t, e, i, s),
      override: (n) => $e(t.override(n), e, i, s),
    };
    return new Proxy(a, {
      deleteProperty: (e, i) => (delete e[i], delete t[i], !0),
      get: (t, e, i) =>
        qe(t, e, () =>
          (function (t, e, i) {
            const { _proxy: s, _context: a, _subProxy: r, _descriptors: l } = t;
            let h = s[e];
            S(h) &&
              l.isScriptable(e) &&
              (h = (function (t, e, i, s) {
                const { _proxy: n, _context: o, _subProxy: a, _stack: r } = i;
                if (r.has(t))
                  throw new Error(
                    "Recursion detected: " + Array.from(r).join("->") + "->" + t
                  );
                r.add(t);
                let l = e(o, a || s);
                r.delete(t), Xe(t, l) && (l = Je(n._scopes, n, t, l));
                return l;
              })(e, h, t, i));
            n(h) &&
              h.length &&
              (h = (function (t, e, i, s) {
                const {
                  _proxy: n,
                  _context: a,
                  _subProxy: r,
                  _descriptors: l,
                } = i;
                if (void 0 !== a.index && s(t)) return e[a.index % e.length];
                if (o(e[0])) {
                  const i = e,
                    s = n._scopes.filter((t) => t !== i);
                  e = [];
                  for (const o of i) {
                    const i = Je(s, n, t, o);
                    e.push($e(i, a, r && r[t], l));
                  }
                }
                return e;
              })(e, h, t, l.isIndexable));
            Xe(e, h) && (h = $e(h, a, r && r[e], l));
            return h;
          })(t, e, i)
        ),
      getOwnPropertyDescriptor: (e, i) =>
        e._descriptors.allKeys
          ? Reflect.has(t, i)
            ? { enumerable: !0, configurable: !0 }
            : void 0
          : Reflect.getOwnPropertyDescriptor(t, i),
      getPrototypeOf: () => Reflect.getPrototypeOf(t),
      has: (e, i) => Reflect.has(t, i),
      ownKeys: () => Reflect.ownKeys(t),
      set: (e, i, s) => ((t[i] = s), delete e[i], !0),
    });
  }
  function Ye(t, e = { scriptable: !0, indexable: !0 }) {
    const {
      _scriptable: i = e.scriptable,
      _indexable: s = e.indexable,
      _allKeys: n = e.allKeys,
    } = t;
    return {
      allKeys: n,
      scriptable: i,
      indexable: s,
      isScriptable: S(i) ? i : () => i,
      isIndexable: S(s) ? s : () => s,
    };
  }
  const Ue = (t, e) => (t ? t + w(e) : e),
    Xe = (t, e) =>
      o(e) &&
      "adapters" !== t &&
      (null === Object.getPrototypeOf(e) || e.constructor === Object);
  function qe(t, e, i) {
    if (Object.prototype.hasOwnProperty.call(t, e) || "constructor" === e)
      return t[e];
    const s = i();
    return (t[e] = s), s;
  }
  function Ke(t, e, i) {
    return S(t) ? t(e, i) : t;
  }
  const Ge = (t, e) => (!0 === t ? e : "string" == typeof t ? M(e, t) : void 0);
  function Ze(t, e, i, s, n) {
    for (const o of e) {
      const e = Ge(i, o);
      if (e) {
        t.add(e);
        const o = Ke(e._fallback, i, n);
        if (void 0 !== o && o !== i && o !== s) return o;
      } else if (!1 === e && void 0 !== s && i !== s) return null;
    }
    return !1;
  }
  function Je(t, e, i, s) {
    const a = e._rootScopes,
      r = Ke(e._fallback, i, s),
      l = [...t, ...a],
      h = new Set();
    h.add(s);
    let c = Qe(h, l, i, r || i, s);
    return (
      null !== c &&
      (void 0 === r || r === i || ((c = Qe(h, l, r, c, s)), null !== c)) &&
      je(Array.from(h), [""], a, r, () =>
        (function (t, e, i) {
          const s = t._getTarget();
          e in s || (s[e] = {});
          const a = s[e];
          if (n(a) && o(i)) return i;
          return a || {};
        })(e, i, s)
      )
    );
  }
  function Qe(t, e, i, s, n) {
    for (; i; ) i = Ze(t, e, i, s, n);
    return i;
  }
  function ti(t, e) {
    for (const i of e) {
      if (!i) continue;
      const e = i[t];
      if (void 0 !== e) return e;
    }
  }
  function ei(t) {
    let e = t._keys;
    return (
      e ||
        (e = t._keys =
          (function (t) {
            const e = new Set();
            for (const i of t)
              for (const t of Object.keys(i).filter((t) => !t.startsWith("_")))
                e.add(t);
            return Array.from(e);
          })(t._scopes)),
      e
    );
  }
  function ii(t, e, i, s) {
    const { iScale: n } = t,
      { key: o = "r" } = this._parsing,
      a = new Array(s);
    let r, l, h, c;
    for (r = 0, l = s; r < l; ++r)
      (h = r + i), (c = e[h]), (a[r] = { r: n.parse(M(c, o), h) });
    return a;
  }
  const si = Number.EPSILON || 1e-14,
    ni = (t, e) => e < t.length && !t[e].skip && t[e],
    oi = (t) => ("x" === t ? "y" : "x");
  function ai(t, e, i, s) {
    const n = t.skip ? e : t,
      o = e,
      a = i.skip ? e : i,
      r = q(o, n),
      l = q(a, o);
    let h = r / (r + l),
      c = l / (r + l);
    (h = isNaN(h) ? 0 : h), (c = isNaN(c) ? 0 : c);
    const d = s * h,
      u = s * c;
    return {
      previous: { x: o.x - d * (a.x - n.x), y: o.y - d * (a.y - n.y) },
      next: { x: o.x + u * (a.x - n.x), y: o.y + u * (a.y - n.y) },
    };
  }
  function ri(t, e = "x") {
    const i = oi(e),
      s = t.length,
      n = Array(s).fill(0),
      o = Array(s);
    let a,
      r,
      l,
      h = ni(t, 0);
    for (a = 0; a < s; ++a)
      if (((r = l), (l = h), (h = ni(t, a + 1)), l)) {
        if (h) {
          const t = h[e] - l[e];
          n[a] = 0 !== t ? (h[i] - l[i]) / t : 0;
        }
        o[a] = r
          ? h
            ? F(n[a - 1]) !== F(n[a])
              ? 0
              : (n[a - 1] + n[a]) / 2
            : n[a - 1]
          : n[a];
      }
    !(function (t, e, i) {
      const s = t.length;
      let n,
        o,
        a,
        r,
        l,
        h = ni(t, 0);
      for (let c = 0; c < s - 1; ++c)
        (l = h),
          (h = ni(t, c + 1)),
          l &&
            h &&
            (V(e[c], 0, si)
              ? (i[c] = i[c + 1] = 0)
              : ((n = i[c] / e[c]),
                (o = i[c + 1] / e[c]),
                (r = Math.pow(n, 2) + Math.pow(o, 2)),
                r <= 9 ||
                  ((a = 3 / Math.sqrt(r)),
                  (i[c] = n * a * e[c]),
                  (i[c + 1] = o * a * e[c]))));
    })(t, n, o),
      (function (t, e, i = "x") {
        const s = oi(i),
          n = t.length;
        let o,
          a,
          r,
          l = ni(t, 0);
        for (let h = 0; h < n; ++h) {
          if (((a = r), (r = l), (l = ni(t, h + 1)), !r)) continue;
          const n = r[i],
            c = r[s];
          a &&
            ((o = (n - a[i]) / 3),
            (r[`cp1${i}`] = n - o),
            (r[`cp1${s}`] = c - o * e[h])),
            l &&
              ((o = (l[i] - n) / 3),
              (r[`cp2${i}`] = n + o),
              (r[`cp2${s}`] = c + o * e[h]));
        }
      })(t, o, e);
  }
  function li(t, e, i) {
    return Math.max(Math.min(t, i), e);
  }
  function hi(t, e, i, s, n) {
    let o, a, r, l;
    if (
      (e.spanGaps && (t = t.filter((t) => !t.skip)),
      "monotone" === e.cubicInterpolationMode)
    )
      ri(t, n);
    else {
      let i = s ? t[t.length - 1] : t[0];
      for (o = 0, a = t.length; o < a; ++o)
        (r = t[o]),
          (l = ai(i, r, t[Math.min(o + 1, a - (s ? 0 : 1)) % a], e.tension)),
          (r.cp1x = l.previous.x),
          (r.cp1y = l.previous.y),
          (r.cp2x = l.next.x),
          (r.cp2y = l.next.y),
          (i = r);
    }
    e.capBezierPoints &&
      (function (t, e) {
        let i,
          s,
          n,
          o,
          a,
          r = Re(t[0], e);
        for (i = 0, s = t.length; i < s; ++i)
          (a = o),
            (o = r),
            (r = i < s - 1 && Re(t[i + 1], e)),
            o &&
              ((n = t[i]),
              a &&
                ((n.cp1x = li(n.cp1x, e.left, e.right)),
                (n.cp1y = li(n.cp1y, e.top, e.bottom))),
              r &&
                ((n.cp2x = li(n.cp2x, e.left, e.right)),
                (n.cp2y = li(n.cp2y, e.top, e.bottom))));
      })(t, i);
  }
  const ci = (t) => 0 === t || 1 === t,
    di = (t, e, i) => -Math.pow(2, 10 * (t -= 1)) * Math.sin(((t - e) * O) / i),
    ui = (t, e, i) => Math.pow(2, -10 * t) * Math.sin(((t - e) * O) / i) + 1,
    fi = {
      linear: (t) => t,
      easeInQuad: (t) => t * t,
      easeOutQuad: (t) => -t * (t - 2),
      easeInOutQuad: (t) =>
        (t /= 0.5) < 1 ? 0.5 * t * t : -0.5 * (--t * (t - 2) - 1),
      easeInCubic: (t) => t * t * t,
      easeOutCubic: (t) => (t -= 1) * t * t + 1,
      easeInOutCubic: (t) =>
        (t /= 0.5) < 1 ? 0.5 * t * t * t : 0.5 * ((t -= 2) * t * t + 2),
      easeInQuart: (t) => t * t * t * t,
      easeOutQuart: (t) => -((t -= 1) * t * t * t - 1),
      easeInOutQuart: (t) =>
        (t /= 0.5) < 1
          ? 0.5 * t * t * t * t
          : -0.5 * ((t -= 2) * t * t * t - 2),
      easeInQuint: (t) => t * t * t * t * t,
      easeOutQuint: (t) => (t -= 1) * t * t * t * t + 1,
      easeInOutQuint: (t) =>
        (t /= 0.5) < 1
          ? 0.5 * t * t * t * t * t
          : 0.5 * ((t -= 2) * t * t * t * t + 2),
      easeInSine: (t) => 1 - Math.cos(t * E),
      easeOutSine: (t) => Math.sin(t * E),
      easeInOutSine: (t) => -0.5 * (Math.cos(C * t) - 1),
      easeInExpo: (t) => (0 === t ? 0 : Math.pow(2, 10 * (t - 1))),
      easeOutExpo: (t) => (1 === t ? 1 : 1 - Math.pow(2, -10 * t)),
      easeInOutExpo: (t) =>
        ci(t)
          ? t
          : t < 0.5
          ? 0.5 * Math.pow(2, 10 * (2 * t - 1))
          : 0.5 * (2 - Math.pow(2, -10 * (2 * t - 1))),
      easeInCirc: (t) => (t >= 1 ? t : -(Math.sqrt(1 - t * t) - 1)),
      easeOutCirc: (t) => Math.sqrt(1 - (t -= 1) * t),
      easeInOutCirc: (t) =>
        (t /= 0.5) < 1
          ? -0.5 * (Math.sqrt(1 - t * t) - 1)
          : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1),
      easeInElastic: (t) => (ci(t) ? t : di(t, 0.075, 0.3)),
      easeOutElastic: (t) => (ci(t) ? t : ui(t, 0.075, 0.3)),
      easeInOutElastic(t) {
        const e = 0.1125;
        return ci(t)
          ? t
          : t < 0.5
          ? 0.5 * di(2 * t, e, 0.45)
          : 0.5 + 0.5 * ui(2 * t - 1, e, 0.45);
      },
      easeInBack(t) {
        const e = 1.70158;
        return t * t * ((e + 1) * t - e);
      },
      easeOutBack(t) {
        const e = 1.70158;
        return (t -= 1) * t * ((e + 1) * t + e) + 1;
      },
      easeInOutBack(t) {
        let e = 1.70158;
        return (t /= 0.5) < 1
          ? t * t * ((1 + (e *= 1.525)) * t - e) * 0.5
          : 0.5 * ((t -= 2) * t * ((1 + (e *= 1.525)) * t + e) + 2);
      },
      easeInBounce: (t) => 1 - fi.easeOutBounce(1 - t),
      easeOutBounce(t) {
        const e = 7.5625,
          i = 2.75;
        return t < 1 / i
          ? e * t * t
          : t < 2 / i
          ? e * (t -= 1.5 / i) * t + 0.75
          : t < 2.5 / i
          ? e * (t -= 2.25 / i) * t + 0.9375
          : e * (t -= 2.625 / i) * t + 0.984375;
      },
      easeInOutBounce: (t) =>
        t < 0.5
          ? 0.5 * fi.easeInBounce(2 * t)
          : 0.5 * fi.easeOutBounce(2 * t - 1) + 0.5,
    };
  function gi(t, e, i, s) {
    return { x: t.x + i * (e.x - t.x), y: t.y + i * (e.y - t.y) };
  }
  function pi(t, e, i, s) {
    return {
      x: t.x + i * (e.x - t.x),
      y:
        "middle" === s
          ? i < 0.5
            ? t.y
            : e.y
          : "after" === s
          ? i < 1
            ? t.y
            : e.y
          : i > 0
          ? e.y
          : t.y,
    };
  }
  function mi(t, e, i, s) {
    const n = { x: t.cp2x, y: t.cp2y },
      o = { x: e.cp1x, y: e.cp1y },
      a = gi(t, n, i),
      r = gi(n, o, i),
      l = gi(o, e, i),
      h = gi(a, r, i),
      c = gi(r, l, i);
    return gi(h, c, i);
  }
  const xi = /^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/,
    bi =
      /^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;
  function _i(t, e) {
    const i = ("" + t).match(xi);
    if (!i || "normal" === i[1]) return 1.2 * e;
    switch (((t = +i[2]), i[3])) {
      case "px":
        return t;
      case "%":
        t /= 100;
    }
    return e * t;
  }
  const yi = (t) => +t || 0;
  function vi(t, e) {
    const i = {},
      s = o(e),
      n = s ? Object.keys(e) : e,
      a = o(t) ? (s ? (i) => l(t[i], t[e[i]]) : (e) => t[e]) : () => t;
    for (const t of n) i[t] = yi(a(t));
    return i;
  }
  function Mi(t) {
    return vi(t, { top: "y", right: "x", bottom: "y", left: "x" });
  }
  function wi(t) {
    return vi(t, ["topLeft", "topRight", "bottomLeft", "bottomRight"]);
  }
  function ki(t) {
    const e = Mi(t);
    return (e.width = e.left + e.right), (e.height = e.top + e.bottom), e;
  }
  function Si(t, e) {
    (t = t || {}), (e = e || ue.font);
    let i = l(t.size, e.size);
    "string" == typeof i && (i = parseInt(i, 10));
    let s = l(t.style, e.style);
    s &&
      !("" + s).match(bi) &&
      (console.warn('Invalid font style specified: "' + s + '"'), (s = void 0));
    const n = {
      family: l(t.family, e.family),
      lineHeight: _i(l(t.lineHeight, e.lineHeight), i),
      size: i,
      style: s,
      weight: l(t.weight, e.weight),
      string: "",
    };
    return (n.string = De(n)), n;
  }
  function Pi(t, e, i, s) {
    let o,
      a,
      r,
      l = !0;
    for (o = 0, a = t.length; o < a; ++o)
      if (
        ((r = t[o]),
        void 0 !== r &&
          (void 0 !== e && "function" == typeof r && ((r = r(e)), (l = !1)),
          void 0 !== i && n(r) && ((r = r[i % r.length]), (l = !1)),
          void 0 !== r))
      )
        return s && !l && (s.cacheable = !1), r;
  }
  function Di(t, e, i) {
    const { min: s, max: n } = t,
      o = c(e, (n - s) / 2),
      a = (t, e) => (i && 0 === t ? 0 : t + e);
    return { min: a(s, -Math.abs(o)), max: a(n, o) };
  }
  function Ci(t, e) {
    return Object.assign(Object.create(t), e);
  }
  function Oi(t, e, i) {
    return t
      ? (function (t, e) {
          return {
            x: (i) => t + t + e - i,
            setWidth(t) {
              e = t;
            },
            textAlign: (t) =>
              "center" === t ? t : "right" === t ? "left" : "right",
            xPlus: (t, e) => t - e,
            leftForLtr: (t, e) => t - e,
          };
        })(e, i)
      : {
          x: (t) => t,
          setWidth(t) {},
          textAlign: (t) => t,
          xPlus: (t, e) => t + e,
          leftForLtr: (t, e) => t,
        };
  }
  function Ai(t, e) {
    let i, s;
    ("ltr" !== e && "rtl" !== e) ||
      ((i = t.canvas.style),
      (s = [
        i.getPropertyValue("direction"),
        i.getPropertyPriority("direction"),
      ]),
      i.setProperty("direction", e, "important"),
      (t.prevTextDirection = s));
  }
  function Ti(t, e) {
    void 0 !== e &&
      (delete t.prevTextDirection,
      t.canvas.style.setProperty("direction", e[0], e[1]));
  }
  function Li(t) {
    return "angle" === t
      ? { between: Z, compare: K, normalize: G }
      : { between: tt, compare: (t, e) => t - e, normalize: (t) => t };
  }
  function Ei({ start: t, end: e, count: i, loop: s, style: n }) {
    return {
      start: t % i,
      end: e % i,
      loop: s && (e - t + 1) % i == 0,
      style: n,
    };
  }
  function Ri(t, e, i) {
    if (!i) return [t];
    const { property: s, start: n, end: o } = i,
      a = e.length,
      { compare: r, between: l, normalize: h } = Li(s),
      {
        start: c,
        end: d,
        loop: u,
        style: f,
      } = (function (t, e, i) {
        const { property: s, start: n, end: o } = i,
          { between: a, normalize: r } = Li(s),
          l = e.length;
        let h,
          c,
          { start: d, end: u, loop: f } = t;
        if (f) {
          for (
            d += l, u += l, h = 0, c = l;
            h < c && a(r(e[d % l][s]), n, o);
            ++h
          )
            d--, u--;
          (d %= l), (u %= l);
        }
        return u < d && (u += l), { start: d, end: u, loop: f, style: t.style };
      })(t, e, i),
      g = [];
    let p,
      m,
      x,
      b = !1,
      _ = null;
    const y = () => b || (l(n, x, p) && 0 !== r(n, x)),
      v = () => !b || 0 === r(o, p) || l(o, x, p);
    for (let t = c, i = c; t <= d; ++t)
      (m = e[t % a]),
        m.skip ||
          ((p = h(m[s])),
          p !== x &&
            ((b = l(p, n, o)),
            null === _ && y() && (_ = 0 === r(p, n) ? t : i),
            null !== _ &&
              v() &&
              (g.push(Ei({ start: _, end: t, loop: u, count: a, style: f })),
              (_ = null)),
            (i = t),
            (x = p)));
    return (
      null !== _ &&
        g.push(Ei({ start: _, end: d, loop: u, count: a, style: f })),
      g
    );
  }
  function Ii(t, e) {
    const i = [],
      s = t.segments;
    for (let n = 0; n < s.length; n++) {
      const o = Ri(s[n], t.points, e);
      o.length && i.push(...o);
    }
    return i;
  }
  function zi(t, e) {
    const i = t.points,
      s = t.options.spanGaps,
      n = i.length;
    if (!n) return [];
    const o = !!t._loop,
      { start: a, end: r } = (function (t, e, i, s) {
        let n = 0,
          o = e - 1;
        if (i && !s) for (; n < e && !t[n].skip; ) n++;
        for (; n < e && t[n].skip; ) n++;
        for (n %= e, i && (o += n); o > n && t[o % e].skip; ) o--;
        return (o %= e), { start: n, end: o };
      })(i, n, o, s);
    if (!0 === s) return Fi(t, [{ start: a, end: r, loop: o }], i, e);
    return Fi(
      t,
      (function (t, e, i, s) {
        const n = t.length,
          o = [];
        let a,
          r = e,
          l = t[e];
        for (a = e + 1; a <= i; ++a) {
          const i = t[a % n];
          i.skip || i.stop
            ? l.skip ||
              ((s = !1),
              o.push({ start: e % n, end: (a - 1) % n, loop: s }),
              (e = r = i.stop ? a : null))
            : ((r = a), l.skip && (e = a)),
            (l = i);
        }
        return null !== r && o.push({ start: e % n, end: r % n, loop: s }), o;
      })(i, a, r < a ? r + n : r, !!t._fullLoop && 0 === a && r === n - 1),
      i,
      e
    );
  }
  function Fi(t, e, i, s) {
    return s && s.setContext && i
      ? (function (t, e, i, s) {
          const n = t._chart.getContext(),
            o = Vi(t.options),
            {
              _datasetIndex: a,
              options: { spanGaps: r },
            } = t,
            l = i.length,
            h = [];
          let c = o,
            d = e[0].start,
            u = d;
          function f(t, e, s, n) {
            const o = r ? -1 : 1;
            if (t !== e) {
              for (t += l; i[t % l].skip; ) t -= o;
              for (; i[e % l].skip; ) e += o;
              t % l != e % l &&
                (h.push({ start: t % l, end: e % l, loop: s, style: n }),
                (c = n),
                (d = e % l));
            }
          }
          for (const t of e) {
            d = r ? d : t.start;
            let e,
              o = i[d % l];
            for (u = d + 1; u <= t.end; u++) {
              const r = i[u % l];
              (e = Vi(
                s.setContext(
                  Ci(n, {
                    type: "segment",
                    p0: o,
                    p1: r,
                    p0DataIndex: (u - 1) % l,
                    p1DataIndex: u % l,
                    datasetIndex: a,
                  })
                )
              )),
                Bi(e, c) && f(d, u - 1, t.loop, c),
                (o = r),
                (c = e);
            }
            d < u - 1 && f(d, u - 1, t.loop, c);
          }
          return h;
        })(t, e, i, s)
      : e;
  }
  function Vi(t) {
    return {
      backgroundColor: t.backgroundColor,
      borderCapStyle: t.borderCapStyle,
      borderDash: t.borderDash,
      borderDashOffset: t.borderDashOffset,
      borderJoinStyle: t.borderJoinStyle,
      borderWidth: t.borderWidth,
      borderColor: t.borderColor,
    };
  }
  function Bi(t, e) {
    if (!e) return !1;
    const i = [],
      s = function (t, e) {
        return Jt(e) ? (i.includes(e) || i.push(e), i.indexOf(e)) : e;
      };
    return JSON.stringify(t, s) !== JSON.stringify(e, s);
  }
  var Wi = Object.freeze({
    __proto__: null,
    HALF_PI: E,
    INFINITY: T,
    PI: C,
    PITAU: A,
    QUARTER_PI: R,
    RAD_PER_DEG: L,
    TAU: O,
    TWO_THIRDS_PI: I,
    _addGrace: Di,
    _alignPixel: Ae,
    _alignStartEnd: ft,
    _angleBetween: Z,
    _angleDiff: K,
    _arrayUnique: lt,
    _attachContext: $e,
    _bezierCurveTo: Ve,
    _bezierInterpolation: mi,
    _boundSegment: Ri,
    _boundSegments: Ii,
    _capitalize: w,
    _computeSegments: zi,
    _createResolver: je,
    _decimalPlaces: U,
    _deprecated: function (t, e, i, s) {
      void 0 !== e &&
        console.warn(
          t + ': "' + i + '" is deprecated. Please use "' + s + '" instead'
        );
    },
    _descriptors: Ye,
    _elementsEqual: f,
    _factorize: W,
    _filterBetween: nt,
    _getParentNode: ge,
    _getStartAndCountOfVisiblePoints: pt,
    _int16Range: Q,
    _isBetween: tt,
    _isClickEvent: D,
    _isDomSupported: fe,
    _isPointInArea: Re,
    _limitValue: J,
    _longestText: Oe,
    _lookup: et,
    _lookupByKey: it,
    _measureText: Ce,
    _merger: m,
    _mergerIf: _,
    _normalizeAngle: G,
    _parseObjectDataRadialScale: ii,
    _pointInLine: gi,
    _readValueToProps: vi,
    _rlookupByKey: st,
    _scaleRangesChanged: mt,
    _setMinAndMaxByKey: j,
    _splitKey: v,
    _steppedInterpolation: pi,
    _steppedLineTo: Fe,
    _textX: gt,
    _toLeftRightCenter: ut,
    _updateBezierControlPoints: hi,
    addRoundedRectPath: He,
    almostEquals: V,
    almostWhole: H,
    callback: d,
    clearCanvas: Te,
    clipArea: Ie,
    clone: g,
    color: Qt,
    createContext: Ci,
    debounce: dt,
    defined: k,
    distanceBetweenPoints: q,
    drawPoint: Le,
    drawPointLegend: Ee,
    each: u,
    easingEffects: fi,
    finiteOrDefault: r,
    fontString: function (t, e, i) {
      return e + " " + t + "px " + i;
    },
    formatNumber: ne,
    getAngleFromPoint: X,
    getHoverColor: te,
    getMaximumSize: we,
    getRelativePosition: ve,
    getRtlAdapter: Oi,
    getStyle: xe,
    isArray: n,
    isFinite: a,
    isFunction: S,
    isNullOrUndef: s,
    isNumber: N,
    isObject: o,
    isPatternOrGradient: Jt,
    listenArrayEvents: at,
    log10: z,
    merge: x,
    mergeIf: b,
    niceNum: B,
    noop: e,
    overrideTextDirection: Ai,
    readUsedSize: Pe,
    renderText: Ne,
    requestAnimFrame: ht,
    resolve: Pi,
    resolveObjectKey: M,
    restoreTextDirection: Ti,
    retinaScale: ke,
    setsEqual: P,
    sign: F,
    splineCurve: ai,
    splineCurveMonotone: ri,
    supportsEventListenerOptions: Se,
    throttled: ct,
    toDegrees: Y,
    toDimension: c,
    toFont: Si,
    toFontString: De,
    toLineHeight: _i,
    toPadding: ki,
    toPercentage: h,
    toRadians: $,
    toTRBL: Mi,
    toTRBLCorners: wi,
    uid: i,
    unclipArea: ze,
    unlistenArrayEvents: rt,
    valueOrDefault: l,
  });
  function Ni(t, e, i, s) {
    const { controller: n, data: o, _sorted: a } = t,
      r = n._cachedMeta.iScale;
    if (r && e === r.axis && "r" !== e && a && o.length) {
      const t = r._reversePixels ? st : it;
      if (!s) return t(o, e, i);
      if (n._sharedOptions) {
        const s = o[0],
          n = "function" == typeof s.getRange && s.getRange(e);
        if (n) {
          const s = t(o, e, i - n),
            a = t(o, e, i + n);
          return { lo: s.lo, hi: a.hi };
        }
      }
    }
    return { lo: 0, hi: o.length - 1 };
  }
  function Hi(t, e, i, s, n) {
    const o = t.getSortedVisibleDatasetMetas(),
      a = i[e];
    for (let t = 0, i = o.length; t < i; ++t) {
      const { index: i, data: r } = o[t],
        { lo: l, hi: h } = Ni(o[t], e, a, n);
      for (let t = l; t <= h; ++t) {
        const e = r[t];
        e.skip || s(e, i, t);
      }
    }
  }
  function ji(t, e, i, s, n) {
    const o = [];
    if (!n && !t.isPointInArea(e)) return o;
    return (
      Hi(
        t,
        i,
        e,
        function (i, a, r) {
          (n || Re(i, t.chartArea, 0)) &&
            i.inRange(e.x, e.y, s) &&
            o.push({ element: i, datasetIndex: a, index: r });
        },
        !0
      ),
      o
    );
  }
  function $i(t, e, i, s, n, o) {
    let a = [];
    const r = (function (t) {
      const e = -1 !== t.indexOf("x"),
        i = -1 !== t.indexOf("y");
      return function (t, s) {
        const n = e ? Math.abs(t.x - s.x) : 0,
          o = i ? Math.abs(t.y - s.y) : 0;
        return Math.sqrt(Math.pow(n, 2) + Math.pow(o, 2));
      };
    })(i);
    let l = Number.POSITIVE_INFINITY;
    return (
      Hi(t, i, e, function (i, h, c) {
        const d = i.inRange(e.x, e.y, n);
        if (s && !d) return;
        const u = i.getCenterPoint(n);
        if (!(!!o || t.isPointInArea(u)) && !d) return;
        const f = r(e, u);
        f < l
          ? ((a = [{ element: i, datasetIndex: h, index: c }]), (l = f))
          : f === l && a.push({ element: i, datasetIndex: h, index: c });
      }),
      a
    );
  }
  function Yi(t, e, i, s, n, o) {
    return o || t.isPointInArea(e)
      ? "r" !== i || s
        ? $i(t, e, i, s, n, o)
        : (function (t, e, i, s) {
            let n = [];
            return (
              Hi(t, i, e, function (t, i, o) {
                const { startAngle: a, endAngle: r } = t.getProps(
                    ["startAngle", "endAngle"],
                    s
                  ),
                  { angle: l } = X(t, { x: e.x, y: e.y });
                Z(l, a, r) && n.push({ element: t, datasetIndex: i, index: o });
              }),
              n
            );
          })(t, e, i, n)
      : [];
  }
  function Ui(t, e, i, s, n) {
    const o = [],
      a = "x" === i ? "inXRange" : "inYRange";
    let r = !1;
    return (
      Hi(t, i, e, (t, s, l) => {
        t[a] &&
          t[a](e[i], n) &&
          (o.push({ element: t, datasetIndex: s, index: l }),
          (r = r || t.inRange(e.x, e.y, n)));
      }),
      s && !r ? [] : o
    );
  }
  var Xi = {
    evaluateInteractionItems: Hi,
    modes: {
      index(t, e, i, s) {
        const n = ve(e, t),
          o = i.axis || "x",
          a = i.includeInvisible || !1,
          r = i.intersect ? ji(t, n, o, s, a) : Yi(t, n, o, !1, s, a),
          l = [];
        return r.length
          ? (t.getSortedVisibleDatasetMetas().forEach((t) => {
              const e = r[0].index,
                i = t.data[e];
              i &&
                !i.skip &&
                l.push({ element: i, datasetIndex: t.index, index: e });
            }),
            l)
          : [];
      },
      dataset(t, e, i, s) {
        const n = ve(e, t),
          o = i.axis || "xy",
          a = i.includeInvisible || !1;
        let r = i.intersect ? ji(t, n, o, s, a) : Yi(t, n, o, !1, s, a);
        if (r.length > 0) {
          const e = r[0].datasetIndex,
            i = t.getDatasetMeta(e).data;
          r = [];
          for (let t = 0; t < i.length; ++t)
            r.push({ element: i[t], datasetIndex: e, index: t });
        }
        return r;
      },
      point: (t, e, i, s) =>
        ji(t, ve(e, t), i.axis || "xy", s, i.includeInvisible || !1),
      nearest(t, e, i, s) {
        const n = ve(e, t),
          o = i.axis || "xy",
          a = i.includeInvisible || !1;
        return Yi(t, n, o, i.intersect, s, a);
      },
      x: (t, e, i, s) => Ui(t, ve(e, t), "x", i.intersect, s),
      y: (t, e, i, s) => Ui(t, ve(e, t), "y", i.intersect, s),
    },
  };
  const qi = ["left", "top", "right", "bottom"];
  function Ki(t, e) {
    return t.filter((t) => t.pos === e);
  }
  function Gi(t, e) {
    return t.filter((t) => -1 === qi.indexOf(t.pos) && t.box.axis === e);
  }
  function Zi(t, e) {
    return t.sort((t, i) => {
      const s = e ? i : t,
        n = e ? t : i;
      return s.weight === n.weight ? s.index - n.index : s.weight - n.weight;
    });
  }
  function Ji(t, e) {
    const i = (function (t) {
        const e = {};
        for (const i of t) {
          const { stack: t, pos: s, stackWeight: n } = i;
          if (!t || !qi.includes(s)) continue;
          const o =
            e[t] || (e[t] = { count: 0, placed: 0, weight: 0, size: 0 });
          o.count++, (o.weight += n);
        }
        return e;
      })(t),
      { vBoxMaxWidth: s, hBoxMaxHeight: n } = e;
    let o, a, r;
    for (o = 0, a = t.length; o < a; ++o) {
      r = t[o];
      const { fullSize: a } = r.box,
        l = i[r.stack],
        h = l && r.stackWeight / l.weight;
      r.horizontal
        ? ((r.width = h ? h * s : a && e.availableWidth), (r.height = n))
        : ((r.width = s), (r.height = h ? h * n : a && e.availableHeight));
    }
    return i;
  }
  function Qi(t, e, i, s) {
    return Math.max(t[i], e[i]) + Math.max(t[s], e[s]);
  }
  function ts(t, e) {
    (t.top = Math.max(t.top, e.top)),
      (t.left = Math.max(t.left, e.left)),
      (t.bottom = Math.max(t.bottom, e.bottom)),
      (t.right = Math.max(t.right, e.right));
  }
  function es(t, e, i, s) {
    const { pos: n, box: a } = i,
      r = t.maxPadding;
    if (!o(n)) {
      i.size && (t[n] -= i.size);
      const e = s[i.stack] || { size: 0, count: 1 };
      (e.size = Math.max(e.size, i.horizontal ? a.height : a.width)),
        (i.size = e.size / e.count),
        (t[n] += i.size);
    }
    a.getPadding && ts(r, a.getPadding());
    const l = Math.max(0, e.outerWidth - Qi(r, t, "left", "right")),
      h = Math.max(0, e.outerHeight - Qi(r, t, "top", "bottom")),
      c = l !== t.w,
      d = h !== t.h;
    return (
      (t.w = l),
      (t.h = h),
      i.horizontal ? { same: c, other: d } : { same: d, other: c }
    );
  }
  function is(t, e) {
    const i = e.maxPadding;
    function s(t) {
      const s = { left: 0, top: 0, right: 0, bottom: 0 };
      return (
        t.forEach((t) => {
          s[t] = Math.max(e[t], i[t]);
        }),
        s
      );
    }
    return s(t ? ["left", "right"] : ["top", "bottom"]);
  }
  function ss(t, e, i, s) {
    const n = [];
    let o, a, r, l, h, c;
    for (o = 0, a = t.length, h = 0; o < a; ++o) {
      (r = t[o]),
        (l = r.box),
        l.update(r.width || e.w, r.height || e.h, is(r.horizontal, e));
      const { same: a, other: d } = es(e, i, r, s);
      (h |= a && n.length), (c = c || d), l.fullSize || n.push(r);
    }
    return (h && ss(n, e, i, s)) || c;
  }
  function ns(t, e, i, s, n) {
    (t.top = i),
      (t.left = e),
      (t.right = e + s),
      (t.bottom = i + n),
      (t.width = s),
      (t.height = n);
  }
  function os(t, e, i, s) {
    const n = i.padding;
    let { x: o, y: a } = e;
    for (const r of t) {
      const t = r.box,
        l = s[r.stack] || { count: 1, placed: 0, weight: 1 },
        h = r.stackWeight / l.weight || 1;
      if (r.horizontal) {
        const s = e.w * h,
          o = l.size || t.height;
        k(l.start) && (a = l.start),
          t.fullSize
            ? ns(t, n.left, a, i.outerWidth - n.right - n.left, o)
            : ns(t, e.left + l.placed, a, s, o),
          (l.start = a),
          (l.placed += s),
          (a = t.bottom);
      } else {
        const s = e.h * h,
          a = l.size || t.width;
        k(l.start) && (o = l.start),
          t.fullSize
            ? ns(t, o, n.top, a, i.outerHeight - n.bottom - n.top)
            : ns(t, o, e.top + l.placed, a, s),
          (l.start = o),
          (l.placed += s),
          (o = t.right);
      }
    }
    (e.x = o), (e.y = a);
  }
  var as = {
    addBox(t, e) {
      t.boxes || (t.boxes = []),
        (e.fullSize = e.fullSize || !1),
        (e.position = e.position || "top"),
        (e.weight = e.weight || 0),
        (e._layers =
          e._layers ||
          function () {
            return [
              {
                z: 0,
                draw(t) {
                  e.draw(t);
                },
              },
            ];
          }),
        t.boxes.push(e);
    },
    removeBox(t, e) {
      const i = t.boxes ? t.boxes.indexOf(e) : -1;
      -1 !== i && t.boxes.splice(i, 1);
    },
    configure(t, e, i) {
      (e.fullSize = i.fullSize),
        (e.position = i.position),
        (e.weight = i.weight);
    },
    update(t, e, i, s) {
      if (!t) return;
      const n = ki(t.options.layout.padding),
        o = Math.max(e - n.width, 0),
        a = Math.max(i - n.height, 0),
        r = (function (t) {
          const e = (function (t) {
              const e = [];
              let i, s, n, o, a, r;
              for (i = 0, s = (t || []).length; i < s; ++i)
                (n = t[i]),
                  ({
                    position: o,
                    options: { stack: a, stackWeight: r = 1 },
                  } = n),
                  e.push({
                    index: i,
                    box: n,
                    pos: o,
                    horizontal: n.isHorizontal(),
                    weight: n.weight,
                    stack: a && o + a,
                    stackWeight: r,
                  });
              return e;
            })(t),
            i = Zi(
              e.filter((t) => t.box.fullSize),
              !0
            ),
            s = Zi(Ki(e, "left"), !0),
            n = Zi(Ki(e, "right")),
            o = Zi(Ki(e, "top"), !0),
            a = Zi(Ki(e, "bottom")),
            r = Gi(e, "x"),
            l = Gi(e, "y");
          return {
            fullSize: i,
            leftAndTop: s.concat(o),
            rightAndBottom: n.concat(l).concat(a).concat(r),
            chartArea: Ki(e, "chartArea"),
            vertical: s.concat(n).concat(l),
            horizontal: o.concat(a).concat(r),
          };
        })(t.boxes),
        l = r.vertical,
        h = r.horizontal;
      u(t.boxes, (t) => {
        "function" == typeof t.beforeLayout && t.beforeLayout();
      });
      const c =
          l.reduce(
            (t, e) =>
              e.box.options && !1 === e.box.options.display ? t : t + 1,
            0
          ) || 1,
        d = Object.freeze({
          outerWidth: e,
          outerHeight: i,
          padding: n,
          availableWidth: o,
          availableHeight: a,
          vBoxMaxWidth: o / 2 / c,
          hBoxMaxHeight: a / 2,
        }),
        f = Object.assign({}, n);
      ts(f, ki(s));
      const g = Object.assign(
          { maxPadding: f, w: o, h: a, x: n.left, y: n.top },
          n
        ),
        p = Ji(l.concat(h), d);
      ss(r.fullSize, g, d, p),
        ss(l, g, d, p),
        ss(h, g, d, p) && ss(l, g, d, p),
        (function (t) {
          const e = t.maxPadding;
          function i(i) {
            const s = Math.max(e[i] - t[i], 0);
            return (t[i] += s), s;
          }
          (t.y += i("top")), (t.x += i("left")), i("right"), i("bottom");
        })(g),
        os(r.leftAndTop, g, d, p),
        (g.x += g.w),
        (g.y += g.h),
        os(r.rightAndBottom, g, d, p),
        (t.chartArea = {
          left: g.left,
          top: g.top,
          right: g.left + g.w,
          bottom: g.top + g.h,
          height: g.h,
          width: g.w,
        }),
        u(r.chartArea, (e) => {
          const i = e.box;
          Object.assign(i, t.chartArea),
            i.update(g.w, g.h, { left: 0, top: 0, right: 0, bottom: 0 });
        });
    },
  };
  class rs {
    acquireContext(t, e) {}
    releaseContext(t) {
      return !1;
    }
    addEventListener(t, e, i) {}
    removeEventListener(t, e, i) {}
    getDevicePixelRatio() {
      return 1;
    }
    getMaximumSize(t, e, i, s) {
      return (
        (e = Math.max(0, e || t.width)),
        (i = i || t.height),
        { width: e, height: Math.max(0, s ? Math.floor(e / s) : i) }
      );
    }
    isAttached(t) {
      return !0;
    }
    updateConfig(t) {}
  }
  class ls extends rs {
    acquireContext(t) {
      return (t && t.getContext && t.getContext("2d")) || null;
    }
    updateConfig(t) {
      t.options.animation = !1;
    }
  }
  const hs = "$chartjs",
    cs = {
      touchstart: "mousedown",
      touchmove: "mousemove",
      touchend: "mouseup",
      pointerenter: "mouseenter",
      pointerdown: "mousedown",
      pointermove: "mousemove",
      pointerup: "mouseup",
      pointerleave: "mouseout",
      pointerout: "mouseout",
    },
    ds = (t) => null === t || "" === t;
  const us = !!Se && { passive: !0 };
  function fs(t, e, i) {
    t && t.canvas && t.canvas.removeEventListener(e, i, us);
  }
  function gs(t, e) {
    for (const i of t) if (i === e || i.contains(e)) return !0;
  }
  function ps(t, e, i) {
    const s = t.canvas,
      n = new MutationObserver((t) => {
        let e = !1;
        for (const i of t)
          (e = e || gs(i.addedNodes, s)), (e = e && !gs(i.removedNodes, s));
        e && i();
      });
    return n.observe(document, { childList: !0, subtree: !0 }), n;
  }
  function ms(t, e, i) {
    const s = t.canvas,
      n = new MutationObserver((t) => {
        let e = !1;
        for (const i of t)
          (e = e || gs(i.removedNodes, s)), (e = e && !gs(i.addedNodes, s));
        e && i();
      });
    return n.observe(document, { childList: !0, subtree: !0 }), n;
  }
  const xs = new Map();
  let bs = 0;
  function _s() {
    const t = window.devicePixelRatio;
    t !== bs &&
      ((bs = t),
      xs.forEach((e, i) => {
        i.currentDevicePixelRatio !== t && e();
      }));
  }
  function ys(t, e, i) {
    const s = t.canvas,
      n = s && ge(s);
    if (!n) return;
    const o = ct((t, e) => {
        const s = n.clientWidth;
        i(t, e), s < n.clientWidth && i();
      }, window),
      a = new ResizeObserver((t) => {
        const e = t[0],
          i = e.contentRect.width,
          s = e.contentRect.height;
        (0 === i && 0 === s) || o(i, s);
      });
    return (
      a.observe(n),
      (function (t, e) {
        xs.size || window.addEventListener("resize", _s), xs.set(t, e);
      })(t, o),
      a
    );
  }
  function vs(t, e, i) {
    i && i.disconnect(),
      "resize" === e &&
        (function (t) {
          xs.delete(t), xs.size || window.removeEventListener("resize", _s);
        })(t);
  }
  function Ms(t, e, i) {
    const s = t.canvas,
      n = ct((e) => {
        null !== t.ctx &&
          i(
            (function (t, e) {
              const i = cs[t.type] || t.type,
                { x: s, y: n } = ve(t, e);
              return {
                type: i,
                chart: e,
                native: t,
                x: void 0 !== s ? s : null,
                y: void 0 !== n ? n : null,
              };
            })(e, t)
          );
      }, t);
    return (
      (function (t, e, i) {
        t && t.addEventListener(e, i, us);
      })(s, e, n),
      n
    );
  }
  class ws extends rs {
    acquireContext(t, e) {
      const i = t && t.getContext && t.getContext("2d");
      return i && i.canvas === t
        ? ((function (t, e) {
            const i = t.style,
              s = t.getAttribute("height"),
              n = t.getAttribute("width");
            if (
              ((t[hs] = {
                initial: {
                  height: s,
                  width: n,
                  style: {
                    display: i.display,
                    height: i.height,
                    width: i.width,
                  },
                },
              }),
              (i.display = i.display || "block"),
              (i.boxSizing = i.boxSizing || "border-box"),
              ds(n))
            ) {
              const e = Pe(t, "width");
              void 0 !== e && (t.width = e);
            }
            if (ds(s))
              if ("" === t.style.height) t.height = t.width / (e || 2);
              else {
                const e = Pe(t, "height");
                void 0 !== e && (t.height = e);
              }
          })(t, e),
          i)
        : null;
    }
    releaseContext(t) {
      const e = t.canvas;
      if (!e[hs]) return !1;
      const i = e[hs].initial;
      ["height", "width"].forEach((t) => {
        const n = i[t];
        s(n) ? e.removeAttribute(t) : e.setAttribute(t, n);
      });
      const n = i.style || {};
      return (
        Object.keys(n).forEach((t) => {
          e.style[t] = n[t];
        }),
        (e.width = e.width),
        delete e[hs],
        !0
      );
    }
    addEventListener(t, e, i) {
      this.removeEventListener(t, e);
      const s = t.$proxies || (t.$proxies = {}),
        n = { attach: ps, detach: ms, resize: ys }[e] || Ms;
      s[e] = n(t, e, i);
    }
    removeEventListener(t, e) {
      const i = t.$proxies || (t.$proxies = {}),
        s = i[e];
      if (!s) return;
      (({ attach: vs, detach: vs, resize: vs })[e] || fs)(t, e, s),
        (i[e] = void 0);
    }
    getDevicePixelRatio() {
      return window.devicePixelRatio;
    }
    getMaximumSize(t, e, i, s) {
      return we(t, e, i, s);
    }
    isAttached(t) {
      const e = t && ge(t);
      return !(!e || !e.isConnected);
    }
  }
  function ks(t) {
    return !fe() ||
      ("undefined" != typeof OffscreenCanvas && t instanceof OffscreenCanvas)
      ? ls
      : ws;
  }
  var Ss = Object.freeze({
    __proto__: null,
    BasePlatform: rs,
    BasicPlatform: ls,
    DomPlatform: ws,
    _detectPlatform: ks,
  });
  const Ps = "transparent",
    Ds = {
      boolean: (t, e, i) => (i > 0.5 ? e : t),
      color(t, e, i) {
        const s = Qt(t || Ps),
          n = s.valid && Qt(e || Ps);
        return n && n.valid ? n.mix(s, i).hexString() : e;
      },
      number: (t, e, i) => t + (e - t) * i,
    };
  class Cs {
    constructor(t, e, i, s) {
      const n = e[i];
      s = Pi([t.to, s, n, t.from]);
      const o = Pi([t.from, n, s]);
      (this._active = !0),
        (this._fn = t.fn || Ds[t.type || typeof o]),
        (this._easing = fi[t.easing] || fi.linear),
        (this._start = Math.floor(Date.now() + (t.delay || 0))),
        (this._duration = this._total = Math.floor(t.duration)),
        (this._loop = !!t.loop),
        (this._target = e),
        (this._prop = i),
        (this._from = o),
        (this._to = s),
        (this._promises = void 0);
    }
    active() {
      return this._active;
    }
    update(t, e, i) {
      if (this._active) {
        this._notify(!1);
        const s = this._target[this._prop],
          n = i - this._start,
          o = this._duration - n;
        (this._start = i),
          (this._duration = Math.floor(Math.max(o, t.duration))),
          (this._total += n),
          (this._loop = !!t.loop),
          (this._to = Pi([t.to, e, s, t.from])),
          (this._from = Pi([t.from, s, e]));
      }
    }
    cancel() {
      this._active &&
        (this.tick(Date.now()), (this._active = !1), this._notify(!1));
    }
    tick(t) {
      const e = t - this._start,
        i = this._duration,
        s = this._prop,
        n = this._from,
        o = this._loop,
        a = this._to;
      let r;
      if (((this._active = n !== a && (o || e < i)), !this._active))
        return (this._target[s] = a), void this._notify(!0);
      e < 0
        ? (this._target[s] = n)
        : ((r = (e / i) % 2),
          (r = o && r > 1 ? 2 - r : r),
          (r = this._easing(Math.min(1, Math.max(0, r)))),
          (this._target[s] = this._fn(n, a, r)));
    }
    wait() {
      const t = this._promises || (this._promises = []);
      return new Promise((e, i) => {
        t.push({ res: e, rej: i });
      });
    }
    _notify(t) {
      const e = t ? "res" : "rej",
        i = this._promises || [];
      for (let t = 0; t < i.length; t++) i[t][e]();
    }
  }
  class Os {
    constructor(t, e) {
      (this._chart = t), (this._properties = new Map()), this.configure(e);
    }
    configure(t) {
      if (!o(t)) return;
      const e = Object.keys(ue.animation),
        i = this._properties;
      Object.getOwnPropertyNames(t).forEach((s) => {
        const a = t[s];
        if (!o(a)) return;
        const r = {};
        for (const t of e) r[t] = a[t];
        ((n(a.properties) && a.properties) || [s]).forEach((t) => {
          (t !== s && i.has(t)) || i.set(t, r);
        });
      });
    }
    _animateOptions(t, e) {
      const i = e.options,
        s = (function (t, e) {
          if (!e) return;
          let i = t.options;
          if (!i) return void (t.options = e);
          i.$shared &&
            (t.options = i =
              Object.assign({}, i, { $shared: !1, $animations: {} }));
          return i;
        })(t, i);
      if (!s) return [];
      const n = this._createAnimations(s, i);
      return (
        i.$shared &&
          (function (t, e) {
            const i = [],
              s = Object.keys(e);
            for (let e = 0; e < s.length; e++) {
              const n = t[s[e]];
              n && n.active() && i.push(n.wait());
            }
            return Promise.all(i);
          })(t.options.$animations, i).then(
            () => {
              t.options = i;
            },
            () => {}
          ),
        n
      );
    }
    _createAnimations(t, e) {
      const i = this._properties,
        s = [],
        n = t.$animations || (t.$animations = {}),
        o = Object.keys(e),
        a = Date.now();
      let r;
      for (r = o.length - 1; r >= 0; --r) {
        const l = o[r];
        if ("$" === l.charAt(0)) continue;
        if ("options" === l) {
          s.push(...this._animateOptions(t, e));
          continue;
        }
        const h = e[l];
        let c = n[l];
        const d = i.get(l);
        if (c) {
          if (d && c.active()) {
            c.update(d, h, a);
            continue;
          }
          c.cancel();
        }
        d && d.duration
          ? ((n[l] = c = new Cs(d, t, l, h)), s.push(c))
          : (t[l] = h);
      }
      return s;
    }
    update(t, e) {
      if (0 === this._properties.size) return void Object.assign(t, e);
      const i = this._createAnimations(t, e);
      return i.length ? (bt.add(this._chart, i), !0) : void 0;
    }
  }
  function As(t, e) {
    const i = (t && t.options) || {},
      s = i.reverse,
      n = void 0 === i.min ? e : 0,
      o = void 0 === i.max ? e : 0;
    return { start: s ? o : n, end: s ? n : o };
  }
  function Ts(t, e) {
    const i = [],
      s = t._getSortedDatasetMetas(e);
    let n, o;
    for (n = 0, o = s.length; n < o; ++n) i.push(s[n].index);
    return i;
  }
  function Ls(t, e, i, s = {}) {
    const n = t.keys,
      o = "single" === s.mode;
    let r, l, h, c;
    if (null !== e) {
      for (r = 0, l = n.length; r < l; ++r) {
        if (((h = +n[r]), h === i)) {
          if (s.all) continue;
          break;
        }
        (c = t.values[h]), a(c) && (o || 0 === e || F(e) === F(c)) && (e += c);
      }
      return e;
    }
  }
  function Es(t, e) {
    const i = t && t.options.stacked;
    return i || (void 0 === i && void 0 !== e.stack);
  }
  function Rs(t, e, i) {
    const s = t[e] || (t[e] = {});
    return s[i] || (s[i] = {});
  }
  function Is(t, e, i, s) {
    for (const n of e.getMatchingVisibleMetas(s).reverse()) {
      const e = t[n.index];
      if ((i && e > 0) || (!i && e < 0)) return n.index;
    }
    return null;
  }
  function zs(t, e) {
    const { chart: i, _cachedMeta: s } = t,
      n = i._stacks || (i._stacks = {}),
      { iScale: o, vScale: a, index: r } = s,
      l = o.axis,
      h = a.axis,
      c = (function (t, e, i) {
        return `${t.id}.${e.id}.${i.stack || i.type}`;
      })(o, a, s),
      d = e.length;
    let u;
    for (let t = 0; t < d; ++t) {
      const i = e[t],
        { [l]: o, [h]: d } = i;
      (u = (i._stacks || (i._stacks = {}))[h] = Rs(n, c, o)),
        (u[r] = d),
        (u._top = Is(u, a, !0, s.type)),
        (u._bottom = Is(u, a, !1, s.type));
      (u._visualValues || (u._visualValues = {}))[r] = d;
    }
  }
  function Fs(t, e) {
    const i = t.scales;
    return Object.keys(i)
      .filter((t) => i[t].axis === e)
      .shift();
  }
  function Vs(t, e) {
    const i = t.controller.index,
      s = t.vScale && t.vScale.axis;
    if (s) {
      e = e || t._parsed;
      for (const t of e) {
        const e = t._stacks;
        if (!e || void 0 === e[s] || void 0 === e[s][i]) return;
        delete e[s][i],
          void 0 !== e[s]._visualValues &&
            void 0 !== e[s]._visualValues[i] &&
            delete e[s]._visualValues[i];
      }
    }
  }
  const Bs = (t) => "reset" === t || "none" === t,
    Ws = (t, e) => (e ? t : Object.assign({}, t));
  class Ns {
    static defaults = {};
    static datasetElementType = null;
    static dataElementType = null;
    constructor(t, e) {
      (this.chart = t),
        (this._ctx = t.ctx),
        (this.index = e),
        (this._cachedDataOpts = {}),
        (this._cachedMeta = this.getMeta()),
        (this._type = this._cachedMeta.type),
        (this.options = void 0),
        (this._parsing = !1),
        (this._data = void 0),
        (this._objectData = void 0),
        (this._sharedOptions = void 0),
        (this._drawStart = void 0),
        (this._drawCount = void 0),
        (this.enableOptionSharing = !1),
        (this.supportsDecimation = !1),
        (this.$context = void 0),
        (this._syncList = []),
        (this.datasetElementType = new.target.datasetElementType),
        (this.dataElementType = new.target.dataElementType),
        this.initialize();
    }
    initialize() {
      const t = this._cachedMeta;
      this.configure(),
        this.linkScales(),
        (t._stacked = Es(t.vScale, t)),
        this.addElements(),
        this.options.fill &&
          !this.chart.isPluginEnabled("filler") &&
          console.warn(
            "Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options"
          );
    }
    updateIndex(t) {
      this.index !== t && Vs(this._cachedMeta), (this.index = t);
    }
    linkScales() {
      const t = this.chart,
        e = this._cachedMeta,
        i = this.getDataset(),
        s = (t, e, i, s) => ("x" === t ? e : "r" === t ? s : i),
        n = (e.xAxisID = l(i.xAxisID, Fs(t, "x"))),
        o = (e.yAxisID = l(i.yAxisID, Fs(t, "y"))),
        a = (e.rAxisID = l(i.rAxisID, Fs(t, "r"))),
        r = e.indexAxis,
        h = (e.iAxisID = s(r, n, o, a)),
        c = (e.vAxisID = s(r, o, n, a));
      (e.xScale = this.getScaleForId(n)),
        (e.yScale = this.getScaleForId(o)),
        (e.rScale = this.getScaleForId(a)),
        (e.iScale = this.getScaleForId(h)),
        (e.vScale = this.getScaleForId(c));
    }
    getDataset() {
      return this.chart.data.datasets[this.index];
    }
    getMeta() {
      return this.chart.getDatasetMeta(this.index);
    }
    getScaleForId(t) {
      return this.chart.scales[t];
    }
    _getOtherScale(t) {
      const e = this._cachedMeta;
      return t === e.iScale ? e.vScale : e.iScale;
    }
    reset() {
      this._update("reset");
    }
    _destroy() {
      const t = this._cachedMeta;
      this._data && rt(this._data, this), t._stacked && Vs(t);
    }
    _dataCheck() {
      const t = this.getDataset(),
        e = t.data || (t.data = []),
        i = this._data;
      if (o(e)) {
        const t = this._cachedMeta;
        this._data = (function (t, e) {
          const { iScale: i, vScale: s } = e,
            n = "x" === i.axis ? "x" : "y",
            o = "x" === s.axis ? "x" : "y",
            a = Object.keys(t),
            r = new Array(a.length);
          let l, h, c;
          for (l = 0, h = a.length; l < h; ++l)
            (c = a[l]), (r[l] = { [n]: c, [o]: t[c] });
          return r;
        })(e, t);
      } else if (i !== e) {
        if (i) {
          rt(i, this);
          const t = this._cachedMeta;
          Vs(t), (t._parsed = []);
        }
        e && Object.isExtensible(e) && at(e, this),
          (this._syncList = []),
          (this._data = e);
      }
    }
    addElements() {
      const t = this._cachedMeta;
      this._dataCheck(),
        this.datasetElementType && (t.dataset = new this.datasetElementType());
    }
    buildOrUpdateElements(t) {
      const e = this._cachedMeta,
        i = this.getDataset();
      let s = !1;
      this._dataCheck();
      const n = e._stacked;
      (e._stacked = Es(e.vScale, e)),
        e.stack !== i.stack && ((s = !0), Vs(e), (e.stack = i.stack)),
        this._resyncElements(t),
        (s || n !== e._stacked) && zs(this, e._parsed);
    }
    configure() {
      const t = this.chart.config,
        e = t.datasetScopeKeys(this._type),
        i = t.getOptionScopes(this.getDataset(), e, !0);
      (this.options = t.createResolver(i, this.getContext())),
        (this._parsing = this.options.parsing),
        (this._cachedDataOpts = {});
    }
    parse(t, e) {
      const { _cachedMeta: i, _data: s } = this,
        { iScale: a, _stacked: r } = i,
        l = a.axis;
      let h,
        c,
        d,
        u = (0 === t && e === s.length) || i._sorted,
        f = t > 0 && i._parsed[t - 1];
      if (!1 === this._parsing) (i._parsed = s), (i._sorted = !0), (d = s);
      else {
        d = n(s[t])
          ? this.parseArrayData(i, s, t, e)
          : o(s[t])
          ? this.parseObjectData(i, s, t, e)
          : this.parsePrimitiveData(i, s, t, e);
        const a = () => null === c[l] || (f && c[l] < f[l]);
        for (h = 0; h < e; ++h)
          (i._parsed[h + t] = c = d[h]), u && (a() && (u = !1), (f = c));
        i._sorted = u;
      }
      r && zs(this, d);
    }
    parsePrimitiveData(t, e, i, s) {
      const { iScale: n, vScale: o } = t,
        a = n.axis,
        r = o.axis,
        l = n.getLabels(),
        h = n === o,
        c = new Array(s);
      let d, u, f;
      for (d = 0, u = s; d < u; ++d)
        (f = d + i),
          (c[d] = { [a]: h || n.parse(l[f], f), [r]: o.parse(e[f], f) });
      return c;
    }
    parseArrayData(t, e, i, s) {
      const { xScale: n, yScale: o } = t,
        a = new Array(s);
      let r, l, h, c;
      for (r = 0, l = s; r < l; ++r)
        (h = r + i),
          (c = e[h]),
          (a[r] = { x: n.parse(c[0], h), y: o.parse(c[1], h) });
      return a;
    }
    parseObjectData(t, e, i, s) {
      const { xScale: n, yScale: o } = t,
        { xAxisKey: a = "x", yAxisKey: r = "y" } = this._parsing,
        l = new Array(s);
      let h, c, d, u;
      for (h = 0, c = s; h < c; ++h)
        (d = h + i),
          (u = e[d]),
          (l[h] = { x: n.parse(M(u, a), d), y: o.parse(M(u, r), d) });
      return l;
    }
    getParsed(t) {
      return this._cachedMeta._parsed[t];
    }
    getDataElement(t) {
      return this._cachedMeta.data[t];
    }
    applyStack(t, e, i) {
      const s = this.chart,
        n = this._cachedMeta,
        o = e[t.axis];
      return Ls(
        { keys: Ts(s, !0), values: e._stacks[t.axis]._visualValues },
        o,
        n.index,
        { mode: i }
      );
    }
    updateRangeFromParsed(t, e, i, s) {
      const n = i[e.axis];
      let o = null === n ? NaN : n;
      const a = s && i._stacks[e.axis];
      s && a && ((s.values = a), (o = Ls(s, n, this._cachedMeta.index))),
        (t.min = Math.min(t.min, o)),
        (t.max = Math.max(t.max, o));
    }
    getMinMax(t, e) {
      const i = this._cachedMeta,
        s = i._parsed,
        n = i._sorted && t === i.iScale,
        o = s.length,
        r = this._getOtherScale(t),
        l = ((t, e, i) =>
          t && !e.hidden && e._stacked && { keys: Ts(i, !0), values: null })(
          e,
          i,
          this.chart
        ),
        h = { min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY },
        { min: c, max: d } = (function (t) {
          const {
            min: e,
            max: i,
            minDefined: s,
            maxDefined: n,
          } = t.getUserBounds();
          return {
            min: s ? e : Number.NEGATIVE_INFINITY,
            max: n ? i : Number.POSITIVE_INFINITY,
          };
        })(r);
      let u, f;
      function g() {
        f = s[u];
        const e = f[r.axis];
        return !a(f[t.axis]) || c > e || d < e;
      }
      for (
        u = 0;
        u < o && (g() || (this.updateRangeFromParsed(h, t, f, l), !n));
        ++u
      );
      if (n)
        for (u = o - 1; u >= 0; --u)
          if (!g()) {
            this.updateRangeFromParsed(h, t, f, l);
            break;
          }
      return h;
    }
    getAllParsedValues(t) {
      const e = this._cachedMeta._parsed,
        i = [];
      let s, n, o;
      for (s = 0, n = e.length; s < n; ++s)
        (o = e[s][t.axis]), a(o) && i.push(o);
      return i;
    }
    getMaxOverflow() {
      return !1;
    }
    getLabelAndValue(t) {
      const e = this._cachedMeta,
        i = e.iScale,
        s = e.vScale,
        n = this.getParsed(t);
      return {
        label: i ? "" + i.getLabelForValue(n[i.axis]) : "",
        value: s ? "" + s.getLabelForValue(n[s.axis]) : "",
      };
    }
    _update(t) {
      const e = this._cachedMeta;
      this.update(t || "default"),
        (e._clip = (function (t) {
          let e, i, s, n;
          return (
            o(t)
              ? ((e = t.top), (i = t.right), (s = t.bottom), (n = t.left))
              : (e = i = s = n = t),
            { top: e, right: i, bottom: s, left: n, disabled: !1 === t }
          );
        })(
          l(
            this.options.clip,
            (function (t, e, i) {
              if (!1 === i) return !1;
              const s = As(t, i),
                n = As(e, i);
              return {
                top: n.end,
                right: s.end,
                bottom: n.start,
                left: s.start,
              };
            })(e.xScale, e.yScale, this.getMaxOverflow())
          )
        ));
    }
    update(t) {}
    draw() {
      const t = this._ctx,
        e = this.chart,
        i = this._cachedMeta,
        s = i.data || [],
        n = e.chartArea,
        o = [],
        a = this._drawStart || 0,
        r = this._drawCount || s.length - a,
        l = this.options.drawActiveElementsOnTop;
      let h;
      for (i.dataset && i.dataset.draw(t, n, a, r), h = a; h < a + r; ++h) {
        const e = s[h];
        e.hidden || (e.active && l ? o.push(e) : e.draw(t, n));
      }
      for (h = 0; h < o.length; ++h) o[h].draw(t, n);
    }
    getStyle(t, e) {
      const i = e ? "active" : "default";
      return void 0 === t && this._cachedMeta.dataset
        ? this.resolveDatasetElementOptions(i)
        : this.resolveDataElementOptions(t || 0, i);
    }
    getContext(t, e, i) {
      const s = this.getDataset();
      let n;
      if (t >= 0 && t < this._cachedMeta.data.length) {
        const e = this._cachedMeta.data[t];
        (n =
          e.$context ||
          (e.$context = (function (t, e, i) {
            return Ci(t, {
              active: !1,
              dataIndex: e,
              parsed: void 0,
              raw: void 0,
              element: i,
              index: e,
              mode: "default",
              type: "data",
            });
          })(this.getContext(), t, e))),
          (n.parsed = this.getParsed(t)),
          (n.raw = s.data[t]),
          (n.index = n.dataIndex = t);
      } else
        (n =
          this.$context ||
          (this.$context = (function (t, e) {
            return Ci(t, {
              active: !1,
              dataset: void 0,
              datasetIndex: e,
              index: e,
              mode: "default",
              type: "dataset",
            });
          })(this.chart.getContext(), this.index))),
          (n.dataset = s),
          (n.index = n.datasetIndex = this.index);
      return (n.active = !!e), (n.mode = i), n;
    }
    resolveDatasetElementOptions(t) {
      return this._resolveElementOptions(this.datasetElementType.id, t);
    }
    resolveDataElementOptions(t, e) {
      return this._resolveElementOptions(this.dataElementType.id, e, t);
    }
    _resolveElementOptions(t, e = "default", i) {
      const s = "active" === e,
        n = this._cachedDataOpts,
        o = t + "-" + e,
        a = n[o],
        r = this.enableOptionSharing && k(i);
      if (a) return Ws(a, r);
      const l = this.chart.config,
        h = l.datasetElementScopeKeys(this._type, t),
        c = s ? [`${t}Hover`, "hover", t, ""] : [t, ""],
        d = l.getOptionScopes(this.getDataset(), h),
        u = Object.keys(ue.elements[t]),
        f = l.resolveNamedOptions(d, u, () => this.getContext(i, s, e), c);
      return (
        f.$shared && ((f.$shared = r), (n[o] = Object.freeze(Ws(f, r)))), f
      );
    }
    _resolveAnimations(t, e, i) {
      const s = this.chart,
        n = this._cachedDataOpts,
        o = `animation-${e}`,
        a = n[o];
      if (a) return a;
      let r;
      if (!1 !== s.options.animation) {
        const s = this.chart.config,
          n = s.datasetAnimationScopeKeys(this._type, e),
          o = s.getOptionScopes(this.getDataset(), n);
        r = s.createResolver(o, this.getContext(t, i, e));
      }
      const l = new Os(s, r && r.animations);
      return r && r._cacheable && (n[o] = Object.freeze(l)), l;
    }
    getSharedOptions(t) {
      if (t.$shared)
        return (
          this._sharedOptions || (this._sharedOptions = Object.assign({}, t))
        );
    }
    includeOptions(t, e) {
      return !e || Bs(t) || this.chart._animationsDisabled;
    }
    _getSharedOptions(t, e) {
      const i = this.resolveDataElementOptions(t, e),
        s = this._sharedOptions,
        n = this.getSharedOptions(i),
        o = this.includeOptions(e, n) || n !== s;
      return (
        this.updateSharedOptions(n, e, i),
        { sharedOptions: n, includeOptions: o }
      );
    }
    updateElement(t, e, i, s) {
      Bs(s) ? Object.assign(t, i) : this._resolveAnimations(e, s).update(t, i);
    }
    updateSharedOptions(t, e, i) {
      t && !Bs(e) && this._resolveAnimations(void 0, e).update(t, i);
    }
    _setStyle(t, e, i, s) {
      t.active = s;
      const n = this.getStyle(e, s);
      this._resolveAnimations(e, i, s).update(t, {
        options: (!s && this.getSharedOptions(n)) || n,
      });
    }
    removeHoverStyle(t, e, i) {
      this._setStyle(t, i, "active", !1);
    }
    setHoverStyle(t, e, i) {
      this._setStyle(t, i, "active", !0);
    }
    _removeDatasetHoverStyle() {
      const t = this._cachedMeta.dataset;
      t && this._setStyle(t, void 0, "active", !1);
    }
    _setDatasetHoverStyle() {
      const t = this._cachedMeta.dataset;
      t && this._setStyle(t, void 0, "active", !0);
    }
    _resyncElements(t) {
      const e = this._data,
        i = this._cachedMeta.data;
      for (const [t, e, i] of this._syncList) this[t](e, i);
      this._syncList = [];
      const s = i.length,
        n = e.length,
        o = Math.min(n, s);
      o && this.parse(0, o),
        n > s
          ? this._insertElements(s, n - s, t)
          : n < s && this._removeElements(n, s - n);
    }
    _insertElements(t, e, i = !0) {
      const s = this._cachedMeta,
        n = s.data,
        o = t + e;
      let a;
      const r = (t) => {
        for (t.length += e, a = t.length - 1; a >= o; a--) t[a] = t[a - e];
      };
      for (r(n), a = t; a < o; ++a) n[a] = new this.dataElementType();
      this._parsing && r(s._parsed),
        this.parse(t, e),
        i && this.updateElements(n, t, e, "reset");
    }
    updateElements(t, e, i, s) {}
    _removeElements(t, e) {
      const i = this._cachedMeta;
      if (this._parsing) {
        const s = i._parsed.splice(t, e);
        i._stacked && Vs(i, s);
      }
      i.data.splice(t, e);
    }
    _sync(t) {
      if (this._parsing) this._syncList.push(t);
      else {
        const [e, i, s] = t;
        this[e](i, s);
      }
      this.chart._dataChanges.push([this.index, ...t]);
    }
    _onDataPush() {
      const t = arguments.length;
      this._sync(["_insertElements", this.getDataset().data.length - t, t]);
    }
    _onDataPop() {
      this._sync(["_removeElements", this._cachedMeta.data.length - 1, 1]);
    }
    _onDataShift() {
      this._sync(["_removeElements", 0, 1]);
    }
    _onDataSplice(t, e) {
      e && this._sync(["_removeElements", t, e]);
      const i = arguments.length - 2;
      i && this._sync(["_insertElements", t, i]);
    }
    _onDataUnshift() {
      this._sync(["_insertElements", 0, arguments.length]);
    }
  }
  class Hs {
    static defaults = {};
    static defaultRoutes = void 0;
    x;
    y;
    active = !1;
    options;
    $animations;
    tooltipPosition(t) {
      const { x: e, y: i } = this.getProps(["x", "y"], t);
      return { x: e, y: i };
    }
    hasValue() {
      return N(this.x) && N(this.y);
    }
    getProps(t, e) {
      const i = this.$animations;
      if (!e || !i) return this;
      const s = {};
      return (
        t.forEach((t) => {
          s[t] = i[t] && i[t].active() ? i[t]._to : this[t];
        }),
        s
      );
    }
  }
  function js(t, e) {
    const i = t.options.ticks,
      n = (function (t) {
        const e = t.options.offset,
          i = t._tickSize(),
          s = t._length / i + (e ? 0 : 1),
          n = t._maxLength / i;
        return Math.floor(Math.min(s, n));
      })(t),
      o = Math.min(i.maxTicksLimit || n, n),
      a = i.major.enabled
        ? (function (t) {
            const e = [];
            let i, s;
            for (i = 0, s = t.length; i < s; i++) t[i].major && e.push(i);
            return e;
          })(e)
        : [],
      r = a.length,
      l = a[0],
      h = a[r - 1],
      c = [];
    if (r > o)
      return (
        (function (t, e, i, s) {
          let n,
            o = 0,
            a = i[0];
          for (s = Math.ceil(s), n = 0; n < t.length; n++)
            n === a && (e.push(t[n]), o++, (a = i[o * s]));
        })(e, c, a, r / o),
        c
      );
    const d = (function (t, e, i) {
      const s = (function (t) {
          const e = t.length;
          let i, s;
          if (e < 2) return !1;
          for (s = t[0], i = 1; i < e; ++i)
            if (t[i] - t[i - 1] !== s) return !1;
          return s;
        })(t),
        n = e.length / i;
      if (!s) return Math.max(n, 1);
      const o = W(s);
      for (let t = 0, e = o.length - 1; t < e; t++) {
        const e = o[t];
        if (e > n) return e;
      }
      return Math.max(n, 1);
    })(a, e, o);
    if (r > 0) {
      let t, i;
      const n = r > 1 ? Math.round((h - l) / (r - 1)) : null;
      for ($s(e, c, d, s(n) ? 0 : l - n, l), t = 0, i = r - 1; t < i; t++)
        $s(e, c, d, a[t], a[t + 1]);
      return $s(e, c, d, h, s(n) ? e.length : h + n), c;
    }
    return $s(e, c, d), c;
  }
  function $s(t, e, i, s, n) {
    const o = l(s, 0),
      a = Math.min(l(n, t.length), t.length);
    let r,
      h,
      c,
      d = 0;
    for (
      i = Math.ceil(i), n && ((r = n - s), (i = r / Math.floor(r / i))), c = o;
      c < 0;

    )
      d++, (c = Math.round(o + d * i));
    for (h = Math.max(o, 0); h < a; h++)
      h === c && (e.push(t[h]), d++, (c = Math.round(o + d * i)));
  }
  const Ys = (t, e, i) => ("top" === e || "left" === e ? t[e] + i : t[e] - i),
    Us = (t, e) => Math.min(e || t, t);
  function Xs(t, e) {
    const i = [],
      s = t.length / e,
      n = t.length;
    let o = 0;
    for (; o < n; o += s) i.push(t[Math.floor(o)]);
    return i;
  }
  function qs(t, e, i) {
    const s = t.ticks.length,
      n = Math.min(e, s - 1),
      o = t._startPixel,
      a = t._endPixel,
      r = 1e-6;
    let l,
      h = t.getPixelForTick(n);
    if (
      !(
        i &&
        ((l =
          1 === s
            ? Math.max(h - o, a - h)
            : 0 === e
            ? (t.getPixelForTick(1) - h) / 2
            : (h - t.getPixelForTick(n - 1)) / 2),
        (h += n < e ? l : -l),
        h < o - r || h > a + r)
      )
    )
      return h;
  }
  function Ks(t) {
    return t.drawTicks ? t.tickLength : 0;
  }
  function Gs(t, e) {
    if (!t.display) return 0;
    const i = Si(t.font, e),
      s = ki(t.padding);
    return (n(t.text) ? t.text.length : 1) * i.lineHeight + s.height;
  }
  function Zs(t, e, i) {
    let s = ut(t);
    return (
      ((i && "right" !== e) || (!i && "right" === e)) &&
        (s = ((t) => ("left" === t ? "right" : "right" === t ? "left" : t))(s)),
      s
    );
  }
  class Js extends Hs {
    constructor(t) {
      super(),
        (this.id = t.id),
        (this.type = t.type),
        (this.options = void 0),
        (this.ctx = t.ctx),
        (this.chart = t.chart),
        (this.top = void 0),
        (this.bottom = void 0),
        (this.left = void 0),
        (this.right = void 0),
        (this.width = void 0),
        (this.height = void 0),
        (this._margins = { left: 0, right: 0, top: 0, bottom: 0 }),
        (this.maxWidth = void 0),
        (this.maxHeight = void 0),
        (this.paddingTop = void 0),
        (this.paddingBottom = void 0),
        (this.paddingLeft = void 0),
        (this.paddingRight = void 0),
        (this.axis = void 0),
        (this.labelRotation = void 0),
        (this.min = void 0),
        (this.max = void 0),
        (this._range = void 0),
        (this.ticks = []),
        (this._gridLineItems = null),
        (this._labelItems = null),
        (this._labelSizes = null),
        (this._length = 0),
        (this._maxLength = 0),
        (this._longestTextCache = {}),
        (this._startPixel = void 0),
        (this._endPixel = void 0),
        (this._reversePixels = !1),
        (this._userMax = void 0),
        (this._userMin = void 0),
        (this._suggestedMax = void 0),
        (this._suggestedMin = void 0),
        (this._ticksLength = 0),
        (this._borderValue = 0),
        (this._cache = {}),
        (this._dataLimitsCached = !1),
        (this.$context = void 0);
    }
    init(t) {
      (this.options = t.setContext(this.getContext())),
        (this.axis = t.axis),
        (this._userMin = this.parse(t.min)),
        (this._userMax = this.parse(t.max)),
        (this._suggestedMin = this.parse(t.suggestedMin)),
        (this._suggestedMax = this.parse(t.suggestedMax));
    }
    parse(t, e) {
      return t;
    }
    getUserBounds() {
      let {
        _userMin: t,
        _userMax: e,
        _suggestedMin: i,
        _suggestedMax: s,
      } = this;
      return (
        (t = r(t, Number.POSITIVE_INFINITY)),
        (e = r(e, Number.NEGATIVE_INFINITY)),
        (i = r(i, Number.POSITIVE_INFINITY)),
        (s = r(s, Number.NEGATIVE_INFINITY)),
        { min: r(t, i), max: r(e, s), minDefined: a(t), maxDefined: a(e) }
      );
    }
    getMinMax(t) {
      let e,
        { min: i, max: s, minDefined: n, maxDefined: o } = this.getUserBounds();
      if (n && o) return { min: i, max: s };
      const a = this.getMatchingVisibleMetas();
      for (let r = 0, l = a.length; r < l; ++r)
        (e = a[r].controller.getMinMax(this, t)),
          n || (i = Math.min(i, e.min)),
          o || (s = Math.max(s, e.max));
      return (
        (i = o && i > s ? s : i),
        (s = n && i > s ? i : s),
        { min: r(i, r(s, i)), max: r(s, r(i, s)) }
      );
    }
    getPadding() {
      return {
        left: this.paddingLeft || 0,
        top: this.paddingTop || 0,
        right: this.paddingRight || 0,
        bottom: this.paddingBottom || 0,
      };
    }
    getTicks() {
      return this.ticks;
    }
    getLabels() {
      const t = this.chart.data;
      return (
        this.options.labels ||
        (this.isHorizontal() ? t.xLabels : t.yLabels) ||
        t.labels ||
        []
      );
    }
    getLabelItems(t = this.chart.chartArea) {
      return (
        this._labelItems || (this._labelItems = this._computeLabelItems(t))
      );
    }
    beforeLayout() {
      (this._cache = {}), (this._dataLimitsCached = !1);
    }
    beforeUpdate() {
      d(this.options.beforeUpdate, [this]);
    }
    update(t, e, i) {
      const { beginAtZero: s, grace: n, ticks: o } = this.options,
        a = o.sampleSize;
      this.beforeUpdate(),
        (this.maxWidth = t),
        (this.maxHeight = e),
        (this._margins = i =
          Object.assign({ left: 0, right: 0, top: 0, bottom: 0 }, i)),
        (this.ticks = null),
        (this._labelSizes = null),
        (this._gridLineItems = null),
        (this._labelItems = null),
        this.beforeSetDimensions(),
        this.setDimensions(),
        this.afterSetDimensions(),
        (this._maxLength = this.isHorizontal()
          ? this.width + i.left + i.right
          : this.height + i.top + i.bottom),
        this._dataLimitsCached ||
          (this.beforeDataLimits(),
          this.determineDataLimits(),
          this.afterDataLimits(),
          (this._range = Di(this, n, s)),
          (this._dataLimitsCached = !0)),
        this.beforeBuildTicks(),
        (this.ticks = this.buildTicks() || []),
        this.afterBuildTicks();
      const r = a < this.ticks.length;
      this._convertTicksToLabels(r ? Xs(this.ticks, a) : this.ticks),
        this.configure(),
        this.beforeCalculateLabelRotation(),
        this.calculateLabelRotation(),
        this.afterCalculateLabelRotation(),
        o.display &&
          (o.autoSkip || "auto" === o.source) &&
          ((this.ticks = js(this, this.ticks)),
          (this._labelSizes = null),
          this.afterAutoSkip()),
        r && this._convertTicksToLabels(this.ticks),
        this.beforeFit(),
        this.fit(),
        this.afterFit(),
        this.afterUpdate();
    }
    configure() {
      let t,
        e,
        i = this.options.reverse;
      this.isHorizontal()
        ? ((t = this.left), (e = this.right))
        : ((t = this.top), (e = this.bottom), (i = !i)),
        (this._startPixel = t),
        (this._endPixel = e),
        (this._reversePixels = i),
        (this._length = e - t),
        (this._alignToPixels = this.options.alignToPixels);
    }
    afterUpdate() {
      d(this.options.afterUpdate, [this]);
    }
    beforeSetDimensions() {
      d(this.options.beforeSetDimensions, [this]);
    }
    setDimensions() {
      this.isHorizontal()
        ? ((this.width = this.maxWidth),
          (this.left = 0),
          (this.right = this.width))
        : ((this.height = this.maxHeight),
          (this.top = 0),
          (this.bottom = this.height)),
        (this.paddingLeft = 0),
        (this.paddingTop = 0),
        (this.paddingRight = 0),
        (this.paddingBottom = 0);
    }
    afterSetDimensions() {
      d(this.options.afterSetDimensions, [this]);
    }
    _callHooks(t) {
      this.chart.notifyPlugins(t, this.getContext()),
        d(this.options[t], [this]);
    }
    beforeDataLimits() {
      this._callHooks("beforeDataLimits");
    }
    determineDataLimits() {}
    afterDataLimits() {
      this._callHooks("afterDataLimits");
    }
    beforeBuildTicks() {
      this._callHooks("beforeBuildTicks");
    }
    buildTicks() {
      return [];
    }
    afterBuildTicks() {
      this._callHooks("afterBuildTicks");
    }
    beforeTickToLabelConversion() {
      d(this.options.beforeTickToLabelConversion, [this]);
    }
    generateTickLabels(t) {
      const e = this.options.ticks;
      let i, s, n;
      for (i = 0, s = t.length; i < s; i++)
        (n = t[i]), (n.label = d(e.callback, [n.value, i, t], this));
    }
    afterTickToLabelConversion() {
      d(this.options.afterTickToLabelConversion, [this]);
    }
    beforeCalculateLabelRotation() {
      d(this.options.beforeCalculateLabelRotation, [this]);
    }
    calculateLabelRotation() {
      const t = this.options,
        e = t.ticks,
        i = Us(this.ticks.length, t.ticks.maxTicksLimit),
        s = e.minRotation || 0,
        n = e.maxRotation;
      let o,
        a,
        r,
        l = s;
      if (
        !this._isVisible() ||
        !e.display ||
        s >= n ||
        i <= 1 ||
        !this.isHorizontal()
      )
        return void (this.labelRotation = s);
      const h = this._getLabelSizes(),
        c = h.widest.width,
        d = h.highest.height,
        u = J(this.chart.width - c, 0, this.maxWidth);
      (o = t.offset ? this.maxWidth / i : u / (i - 1)),
        c + 6 > o &&
          ((o = u / (i - (t.offset ? 0.5 : 1))),
          (a =
            this.maxHeight -
            Ks(t.grid) -
            e.padding -
            Gs(t.title, this.chart.options.font)),
          (r = Math.sqrt(c * c + d * d)),
          (l = Y(
            Math.min(
              Math.asin(J((h.highest.height + 6) / o, -1, 1)),
              Math.asin(J(a / r, -1, 1)) - Math.asin(J(d / r, -1, 1))
            )
          )),
          (l = Math.max(s, Math.min(n, l)))),
        (this.labelRotation = l);
    }
    afterCalculateLabelRotation() {
      d(this.options.afterCalculateLabelRotation, [this]);
    }
    afterAutoSkip() {}
    beforeFit() {
      d(this.options.beforeFit, [this]);
    }
    fit() {
      const t = { width: 0, height: 0 },
        {
          chart: e,
          options: { ticks: i, title: s, grid: n },
        } = this,
        o = this._isVisible(),
        a = this.isHorizontal();
      if (o) {
        const o = Gs(s, e.options.font);
        if (
          (a
            ? ((t.width = this.maxWidth), (t.height = Ks(n) + o))
            : ((t.height = this.maxHeight), (t.width = Ks(n) + o)),
          i.display && this.ticks.length)
        ) {
          const {
              first: e,
              last: s,
              widest: n,
              highest: o,
            } = this._getLabelSizes(),
            r = 2 * i.padding,
            l = $(this.labelRotation),
            h = Math.cos(l),
            c = Math.sin(l);
          if (a) {
            const e = i.mirror ? 0 : c * n.width + h * o.height;
            t.height = Math.min(this.maxHeight, t.height + e + r);
          } else {
            const e = i.mirror ? 0 : h * n.width + c * o.height;
            t.width = Math.min(this.maxWidth, t.width + e + r);
          }
          this._calculatePadding(e, s, c, h);
        }
      }
      this._handleMargins(),
        a
          ? ((this.width = this._length =
              e.width - this._margins.left - this._margins.right),
            (this.height = t.height))
          : ((this.width = t.width),
            (this.height = this._length =
              e.height - this._margins.top - this._margins.bottom));
    }
    _calculatePadding(t, e, i, s) {
      const {
          ticks: { align: n, padding: o },
          position: a,
        } = this.options,
        r = 0 !== this.labelRotation,
        l = "top" !== a && "x" === this.axis;
      if (this.isHorizontal()) {
        const a = this.getPixelForTick(0) - this.left,
          h = this.right - this.getPixelForTick(this.ticks.length - 1);
        let c = 0,
          d = 0;
        r
          ? l
            ? ((c = s * t.width), (d = i * e.height))
            : ((c = i * t.height), (d = s * e.width))
          : "start" === n
          ? (d = e.width)
          : "end" === n
          ? (c = t.width)
          : "inner" !== n && ((c = t.width / 2), (d = e.width / 2)),
          (this.paddingLeft = Math.max(
            ((c - a + o) * this.width) / (this.width - a),
            0
          )),
          (this.paddingRight = Math.max(
            ((d - h + o) * this.width) / (this.width - h),
            0
          ));
      } else {
        let i = e.height / 2,
          s = t.height / 2;
        "start" === n
          ? ((i = 0), (s = t.height))
          : "end" === n && ((i = e.height), (s = 0)),
          (this.paddingTop = i + o),
          (this.paddingBottom = s + o);
      }
    }
    _handleMargins() {
      this._margins &&
        ((this._margins.left = Math.max(this.paddingLeft, this._margins.left)),
        (this._margins.top = Math.max(this.paddingTop, this._margins.top)),
        (this._margins.right = Math.max(
          this.paddingRight,
          this._margins.right
        )),
        (this._margins.bottom = Math.max(
          this.paddingBottom,
          this._margins.bottom
        )));
    }
    afterFit() {
      d(this.options.afterFit, [this]);
    }
    isHorizontal() {
      const { axis: t, position: e } = this.options;
      return "top" === e || "bottom" === e || "x" === t;
    }
    isFullSize() {
      return this.options.fullSize;
    }
    _convertTicksToLabels(t) {
      let e, i;
      for (
        this.beforeTickToLabelConversion(),
          this.generateTickLabels(t),
          e = 0,
          i = t.length;
        e < i;
        e++
      )
        s(t[e].label) && (t.splice(e, 1), i--, e--);
      this.afterTickToLabelConversion();
    }
    _getLabelSizes() {
      let t = this._labelSizes;
      if (!t) {
        const e = this.options.ticks.sampleSize;
        let i = this.ticks;
        e < i.length && (i = Xs(i, e)),
          (this._labelSizes = t =
            this._computeLabelSizes(
              i,
              i.length,
              this.options.ticks.maxTicksLimit
            ));
      }
      return t;
    }
    _computeLabelSizes(t, e, i) {
      const { ctx: o, _longestTextCache: a } = this,
        r = [],
        l = [],
        h = Math.floor(e / Us(e, i));
      let c,
        d,
        f,
        g,
        p,
        m,
        x,
        b,
        _,
        y,
        v,
        M = 0,
        w = 0;
      for (c = 0; c < e; c += h) {
        if (
          ((g = t[c].label),
          (p = this._resolveTickFontOptions(c)),
          (o.font = m = p.string),
          (x = a[m] = a[m] || { data: {}, gc: [] }),
          (b = p.lineHeight),
          (_ = y = 0),
          s(g) || n(g))
        ) {
          if (n(g))
            for (d = 0, f = g.length; d < f; ++d)
              (v = g[d]),
                s(v) || n(v) || ((_ = Ce(o, x.data, x.gc, _, v)), (y += b));
        } else (_ = Ce(o, x.data, x.gc, _, g)), (y = b);
        r.push(_), l.push(y), (M = Math.max(_, M)), (w = Math.max(y, w));
      }
      !(function (t, e) {
        u(t, (t) => {
          const i = t.gc,
            s = i.length / 2;
          let n;
          if (s > e) {
            for (n = 0; n < s; ++n) delete t.data[i[n]];
            i.splice(0, s);
          }
        });
      })(a, e);
      const k = r.indexOf(M),
        S = l.indexOf(w),
        P = (t) => ({ width: r[t] || 0, height: l[t] || 0 });
      return {
        first: P(0),
        last: P(e - 1),
        widest: P(k),
        highest: P(S),
        widths: r,
        heights: l,
      };
    }
    getLabelForValue(t) {
      return t;
    }
    getPixelForValue(t, e) {
      return NaN;
    }
    getValueForPixel(t) {}
    getPixelForTick(t) {
      const e = this.ticks;
      return t < 0 || t > e.length - 1
        ? null
        : this.getPixelForValue(e[t].value);
    }
    getPixelForDecimal(t) {
      this._reversePixels && (t = 1 - t);
      const e = this._startPixel + t * this._length;
      return Q(this._alignToPixels ? Ae(this.chart, e, 0) : e);
    }
    getDecimalForPixel(t) {
      const e = (t - this._startPixel) / this._length;
      return this._reversePixels ? 1 - e : e;
    }
    getBasePixel() {
      return this.getPixelForValue(this.getBaseValue());
    }
    getBaseValue() {
      const { min: t, max: e } = this;
      return t < 0 && e < 0 ? e : t > 0 && e > 0 ? t : 0;
    }
    getContext(t) {
      const e = this.ticks || [];
      if (t >= 0 && t < e.length) {
        const i = e[t];
        return (
          i.$context ||
          (i.$context = (function (t, e, i) {
            return Ci(t, { tick: i, index: e, type: "tick" });
          })(this.getContext(), t, i))
        );
      }
      return (
        this.$context ||
        (this.$context = Ci(this.chart.getContext(), {
          scale: this,
          type: "scale",
        }))
      );
    }
    _tickSize() {
      const t = this.options.ticks,
        e = $(this.labelRotation),
        i = Math.abs(Math.cos(e)),
        s = Math.abs(Math.sin(e)),
        n = this._getLabelSizes(),
        o = t.autoSkipPadding || 0,
        a = n ? n.widest.width + o : 0,
        r = n ? n.highest.height + o : 0;
      return this.isHorizontal()
        ? r * i > a * s
          ? a / i
          : r / s
        : r * s < a * i
        ? r / i
        : a / s;
    }
    _isVisible() {
      const t = this.options.display;
      return "auto" !== t ? !!t : this.getMatchingVisibleMetas().length > 0;
    }
    _computeGridLineItems(t) {
      const e = this.axis,
        i = this.chart,
        s = this.options,
        { grid: n, position: a, border: r } = s,
        h = n.offset,
        c = this.isHorizontal(),
        d = this.ticks.length + (h ? 1 : 0),
        u = Ks(n),
        f = [],
        g = r.setContext(this.getContext()),
        p = g.display ? g.width : 0,
        m = p / 2,
        x = function (t) {
          return Ae(i, t, p);
        };
      let b, _, y, v, M, w, k, S, P, D, C, O;
      if ("top" === a)
        (b = x(this.bottom)),
          (w = this.bottom - u),
          (S = b - m),
          (D = x(t.top) + m),
          (O = t.bottom);
      else if ("bottom" === a)
        (b = x(this.top)),
          (D = t.top),
          (O = x(t.bottom) - m),
          (w = b + m),
          (S = this.top + u);
      else if ("left" === a)
        (b = x(this.right)),
          (M = this.right - u),
          (k = b - m),
          (P = x(t.left) + m),
          (C = t.right);
      else if ("right" === a)
        (b = x(this.left)),
          (P = t.left),
          (C = x(t.right) - m),
          (M = b + m),
          (k = this.left + u);
      else if ("x" === e) {
        if ("center" === a) b = x((t.top + t.bottom) / 2 + 0.5);
        else if (o(a)) {
          const t = Object.keys(a)[0],
            e = a[t];
          b = x(this.chart.scales[t].getPixelForValue(e));
        }
        (D = t.top), (O = t.bottom), (w = b + m), (S = w + u);
      } else if ("y" === e) {
        if ("center" === a) b = x((t.left + t.right) / 2);
        else if (o(a)) {
          const t = Object.keys(a)[0],
            e = a[t];
          b = x(this.chart.scales[t].getPixelForValue(e));
        }
        (M = b - m), (k = M - u), (P = t.left), (C = t.right);
      }
      const A = l(s.ticks.maxTicksLimit, d),
        T = Math.max(1, Math.ceil(d / A));
      for (_ = 0; _ < d; _ += T) {
        const t = this.getContext(_),
          e = n.setContext(t),
          s = r.setContext(t),
          o = e.lineWidth,
          a = e.color,
          l = s.dash || [],
          d = s.dashOffset,
          u = e.tickWidth,
          g = e.tickColor,
          p = e.tickBorderDash || [],
          m = e.tickBorderDashOffset;
        (y = qs(this, _, h)),
          void 0 !== y &&
            ((v = Ae(i, y, o)),
            c ? (M = k = P = C = v) : (w = S = D = O = v),
            f.push({
              tx1: M,
              ty1: w,
              tx2: k,
              ty2: S,
              x1: P,
              y1: D,
              x2: C,
              y2: O,
              width: o,
              color: a,
              borderDash: l,
              borderDashOffset: d,
              tickWidth: u,
              tickColor: g,
              tickBorderDash: p,
              tickBorderDashOffset: m,
            }));
      }
      return (this._ticksLength = d), (this._borderValue = b), f;
    }
    _computeLabelItems(t) {
      const e = this.axis,
        i = this.options,
        { position: s, ticks: a } = i,
        r = this.isHorizontal(),
        l = this.ticks,
        { align: h, crossAlign: c, padding: d, mirror: u } = a,
        f = Ks(i.grid),
        g = f + d,
        p = u ? -d : g,
        m = -$(this.labelRotation),
        x = [];
      let b,
        _,
        y,
        v,
        M,
        w,
        k,
        S,
        P,
        D,
        C,
        O,
        A = "middle";
      if ("top" === s)
        (w = this.bottom - p), (k = this._getXAxisLabelAlignment());
      else if ("bottom" === s)
        (w = this.top + p), (k = this._getXAxisLabelAlignment());
      else if ("left" === s) {
        const t = this._getYAxisLabelAlignment(f);
        (k = t.textAlign), (M = t.x);
      } else if ("right" === s) {
        const t = this._getYAxisLabelAlignment(f);
        (k = t.textAlign), (M = t.x);
      } else if ("x" === e) {
        if ("center" === s) w = (t.top + t.bottom) / 2 + g;
        else if (o(s)) {
          const t = Object.keys(s)[0],
            e = s[t];
          w = this.chart.scales[t].getPixelForValue(e) + g;
        }
        k = this._getXAxisLabelAlignment();
      } else if ("y" === e) {
        if ("center" === s) M = (t.left + t.right) / 2 - g;
        else if (o(s)) {
          const t = Object.keys(s)[0],
            e = s[t];
          M = this.chart.scales[t].getPixelForValue(e);
        }
        k = this._getYAxisLabelAlignment(f).textAlign;
      }
      "y" === e &&
        ("start" === h ? (A = "top") : "end" === h && (A = "bottom"));
      const T = this._getLabelSizes();
      for (b = 0, _ = l.length; b < _; ++b) {
        (y = l[b]), (v = y.label);
        const t = a.setContext(this.getContext(b));
        (S = this.getPixelForTick(b) + a.labelOffset),
          (P = this._resolveTickFontOptions(b)),
          (D = P.lineHeight),
          (C = n(v) ? v.length : 1);
        const e = C / 2,
          i = t.color,
          o = t.textStrokeColor,
          h = t.textStrokeWidth;
        let d,
          f = k;
        if (
          (r
            ? ((M = S),
              "inner" === k &&
                (f =
                  b === _ - 1
                    ? this.options.reverse
                      ? "left"
                      : "right"
                    : 0 === b
                    ? this.options.reverse
                      ? "right"
                      : "left"
                    : "center"),
              (O =
                "top" === s
                  ? "near" === c || 0 !== m
                    ? -C * D + D / 2
                    : "center" === c
                    ? -T.highest.height / 2 - e * D + D
                    : -T.highest.height + D / 2
                  : "near" === c || 0 !== m
                  ? D / 2
                  : "center" === c
                  ? T.highest.height / 2 - e * D
                  : T.highest.height - C * D),
              u && (O *= -1),
              0 === m || t.showLabelBackdrop || (M += (D / 2) * Math.sin(m)))
            : ((w = S), (O = ((1 - C) * D) / 2)),
          t.showLabelBackdrop)
        ) {
          const e = ki(t.backdropPadding),
            i = T.heights[b],
            s = T.widths[b];
          let n = O - e.top,
            o = 0 - e.left;
          switch (A) {
            case "middle":
              n -= i / 2;
              break;
            case "bottom":
              n -= i;
          }
          switch (k) {
            case "center":
              o -= s / 2;
              break;
            case "right":
              o -= s;
              break;
            case "inner":
              b === _ - 1 ? (o -= s) : b > 0 && (o -= s / 2);
          }
          d = {
            left: o,
            top: n,
            width: s + e.width,
            height: i + e.height,
            color: t.backdropColor,
          };
        }
        x.push({
          label: v,
          font: P,
          textOffset: O,
          options: {
            rotation: m,
            color: i,
            strokeColor: o,
            strokeWidth: h,
            textAlign: f,
            textBaseline: A,
            translation: [M, w],
            backdrop: d,
          },
        });
      }
      return x;
    }
    _getXAxisLabelAlignment() {
      const { position: t, ticks: e } = this.options;
      if (-$(this.labelRotation)) return "top" === t ? "left" : "right";
      let i = "center";
      return (
        "start" === e.align
          ? (i = "left")
          : "end" === e.align
          ? (i = "right")
          : "inner" === e.align && (i = "inner"),
        i
      );
    }
    _getYAxisLabelAlignment(t) {
      const {
          position: e,
          ticks: { crossAlign: i, mirror: s, padding: n },
        } = this.options,
        o = t + n,
        a = this._getLabelSizes().widest.width;
      let r, l;
      return (
        "left" === e
          ? s
            ? ((l = this.right + n),
              "near" === i
                ? (r = "left")
                : "center" === i
                ? ((r = "center"), (l += a / 2))
                : ((r = "right"), (l += a)))
            : ((l = this.right - o),
              "near" === i
                ? (r = "right")
                : "center" === i
                ? ((r = "center"), (l -= a / 2))
                : ((r = "left"), (l = this.left)))
          : "right" === e
          ? s
            ? ((l = this.left + n),
              "near" === i
                ? (r = "right")
                : "center" === i
                ? ((r = "center"), (l -= a / 2))
                : ((r = "left"), (l -= a)))
            : ((l = this.left + o),
              "near" === i
                ? (r = "left")
                : "center" === i
                ? ((r = "center"), (l += a / 2))
                : ((r = "right"), (l = this.right)))
          : (r = "right"),
        { textAlign: r, x: l }
      );
    }
    _computeLabelArea() {
      if (this.options.ticks.mirror) return;
      const t = this.chart,
        e = this.options.position;
      return "left" === e || "right" === e
        ? { top: 0, left: this.left, bottom: t.height, right: this.right }
        : "top" === e || "bottom" === e
        ? { top: this.top, left: 0, bottom: this.bottom, right: t.width }
        : void 0;
    }
    drawBackground() {
      const {
        ctx: t,
        options: { backgroundColor: e },
        left: i,
        top: s,
        width: n,
        height: o,
      } = this;
      e && (t.save(), (t.fillStyle = e), t.fillRect(i, s, n, o), t.restore());
    }
    getLineWidthForValue(t) {
      const e = this.options.grid;
      if (!this._isVisible() || !e.display) return 0;
      const i = this.ticks.findIndex((e) => e.value === t);
      if (i >= 0) {
        return e.setContext(this.getContext(i)).lineWidth;
      }
      return 0;
    }
    drawGrid(t) {
      const e = this.options.grid,
        i = this.ctx,
        s =
          this._gridLineItems ||
          (this._gridLineItems = this._computeGridLineItems(t));
      let n, o;
      const a = (t, e, s) => {
        s.width &&
          s.color &&
          (i.save(),
          (i.lineWidth = s.width),
          (i.strokeStyle = s.color),
          i.setLineDash(s.borderDash || []),
          (i.lineDashOffset = s.borderDashOffset),
          i.beginPath(),
          i.moveTo(t.x, t.y),
          i.lineTo(e.x, e.y),
          i.stroke(),
          i.restore());
      };
      if (e.display)
        for (n = 0, o = s.length; n < o; ++n) {
          const t = s[n];
          e.drawOnChartArea && a({ x: t.x1, y: t.y1 }, { x: t.x2, y: t.y2 }, t),
            e.drawTicks &&
              a(
                { x: t.tx1, y: t.ty1 },
                { x: t.tx2, y: t.ty2 },
                {
                  color: t.tickColor,
                  width: t.tickWidth,
                  borderDash: t.tickBorderDash,
                  borderDashOffset: t.tickBorderDashOffset,
                }
              );
        }
    }
    drawBorder() {
      const {
          chart: t,
          ctx: e,
          options: { border: i, grid: s },
        } = this,
        n = i.setContext(this.getContext()),
        o = i.display ? n.width : 0;
      if (!o) return;
      const a = s.setContext(this.getContext(0)).lineWidth,
        r = this._borderValue;
      let l, h, c, d;
      this.isHorizontal()
        ? ((l = Ae(t, this.left, o) - o / 2),
          (h = Ae(t, this.right, a) + a / 2),
          (c = d = r))
        : ((c = Ae(t, this.top, o) - o / 2),
          (d = Ae(t, this.bottom, a) + a / 2),
          (l = h = r)),
        e.save(),
        (e.lineWidth = n.width),
        (e.strokeStyle = n.color),
        e.beginPath(),
        e.moveTo(l, c),
        e.lineTo(h, d),
        e.stroke(),
        e.restore();
    }
    drawLabels(t) {
      if (!this.options.ticks.display) return;
      const e = this.ctx,
        i = this._computeLabelArea();
      i && Ie(e, i);
      const s = this.getLabelItems(t);
      for (const t of s) {
        const i = t.options,
          s = t.font;
        Ne(e, t.label, 0, t.textOffset, s, i);
      }
      i && ze(e);
    }
    drawTitle() {
      const {
        ctx: t,
        options: { position: e, title: i, reverse: s },
      } = this;
      if (!i.display) return;
      const a = Si(i.font),
        r = ki(i.padding),
        l = i.align;
      let h = a.lineHeight / 2;
      "bottom" === e || "center" === e || o(e)
        ? ((h += r.bottom),
          n(i.text) && (h += a.lineHeight * (i.text.length - 1)))
        : (h += r.top);
      const {
        titleX: c,
        titleY: d,
        maxWidth: u,
        rotation: f,
      } = (function (t, e, i, s) {
        const { top: n, left: a, bottom: r, right: l, chart: h } = t,
          { chartArea: c, scales: d } = h;
        let u,
          f,
          g,
          p = 0;
        const m = r - n,
          x = l - a;
        if (t.isHorizontal()) {
          if (((f = ft(s, a, l)), o(i))) {
            const t = Object.keys(i)[0],
              s = i[t];
            g = d[t].getPixelForValue(s) + m - e;
          } else
            g = "center" === i ? (c.bottom + c.top) / 2 + m - e : Ys(t, i, e);
          u = l - a;
        } else {
          if (o(i)) {
            const t = Object.keys(i)[0],
              s = i[t];
            f = d[t].getPixelForValue(s) - x + e;
          } else
            f = "center" === i ? (c.left + c.right) / 2 - x + e : Ys(t, i, e);
          (g = ft(s, r, n)), (p = "left" === i ? -E : E);
        }
        return { titleX: f, titleY: g, maxWidth: u, rotation: p };
      })(this, h, e, l);
      Ne(t, i.text, 0, 0, a, {
        color: i.color,
        maxWidth: u,
        rotation: f,
        textAlign: Zs(l, e, s),
        textBaseline: "middle",
        translation: [c, d],
      });
    }
    draw(t) {
      this._isVisible() &&
        (this.drawBackground(),
        this.drawGrid(t),
        this.drawBorder(),
        this.drawTitle(),
        this.drawLabels(t));
    }
    _layers() {
      const t = this.options,
        e = (t.ticks && t.ticks.z) || 0,
        i = l(t.grid && t.grid.z, -1),
        s = l(t.border && t.border.z, 0);
      return this._isVisible() && this.draw === Js.prototype.draw
        ? [
            {
              z: i,
              draw: (t) => {
                this.drawBackground(), this.drawGrid(t), this.drawTitle();
              },
            },
            {
              z: s,
              draw: () => {
                this.drawBorder();
              },
            },
            {
              z: e,
              draw: (t) => {
                this.drawLabels(t);
              },
            },
          ]
        : [
            {
              z: e,
              draw: (t) => {
                this.draw(t);
              },
            },
          ];
    }
    getMatchingVisibleMetas(t) {
      const e = this.chart.getSortedVisibleDatasetMetas(),
        i = this.axis + "AxisID",
        s = [];
      let n, o;
      for (n = 0, o = e.length; n < o; ++n) {
        const o = e[n];
        o[i] !== this.id || (t && o.type !== t) || s.push(o);
      }
      return s;
    }
    _resolveTickFontOptions(t) {
      return Si(this.options.ticks.setContext(this.getContext(t)).font);
    }
    _maxDigits() {
      const t = this._resolveTickFontOptions(0).lineHeight;
      return (this.isHorizontal() ? this.width : this.height) / t;
    }
  }
  class Qs {
    constructor(t, e, i) {
      (this.type = t),
        (this.scope = e),
        (this.override = i),
        (this.items = Object.create(null));
    }
    isForType(t) {
      return Object.prototype.isPrototypeOf.call(
        this.type.prototype,
        t.prototype
      );
    }
    register(t) {
      const e = Object.getPrototypeOf(t);
      let i;
      (function (t) {
        return "id" in t && "defaults" in t;
      })(e) && (i = this.register(e));
      const s = this.items,
        n = t.id,
        o = this.scope + "." + n;
      if (!n) throw new Error("class does not have id: " + t);
      return (
        n in s ||
          ((s[n] = t),
          (function (t, e, i) {
            const s = x(Object.create(null), [
              i ? ue.get(i) : {},
              ue.get(e),
              t.defaults,
            ]);
            ue.set(e, s),
              t.defaultRoutes &&
                (function (t, e) {
                  Object.keys(e).forEach((i) => {
                    const s = i.split("."),
                      n = s.pop(),
                      o = [t].concat(s).join("."),
                      a = e[i].split("."),
                      r = a.pop(),
                      l = a.join(".");
                    ue.route(o, n, l, r);
                  });
                })(e, t.defaultRoutes);
            t.descriptors && ue.describe(e, t.descriptors);
          })(t, o, i),
          this.override && ue.override(t.id, t.overrides)),
        o
      );
    }
    get(t) {
      return this.items[t];
    }
    unregister(t) {
      const e = this.items,
        i = t.id,
        s = this.scope;
      i in e && delete e[i],
        s && i in ue[s] && (delete ue[s][i], this.override && delete re[i]);
    }
  }
  class tn {
    constructor() {
      (this.controllers = new Qs(Ns, "datasets", !0)),
        (this.elements = new Qs(Hs, "elements")),
        (this.plugins = new Qs(Object, "plugins")),
        (this.scales = new Qs(Js, "scales")),
        (this._typedRegistries = [
          this.controllers,
          this.scales,
          this.elements,
        ]);
    }
    add(...t) {
      this._each("register", t);
    }
    remove(...t) {
      this._each("unregister", t);
    }
    addControllers(...t) {
      this._each("register", t, this.controllers);
    }
    addElements(...t) {
      this._each("register", t, this.elements);
    }
    addPlugins(...t) {
      this._each("register", t, this.plugins);
    }
    addScales(...t) {
      this._each("register", t, this.scales);
    }
    getController(t) {
      return this._get(t, this.controllers, "controller");
    }
    getElement(t) {
      return this._get(t, this.elements, "element");
    }
    getPlugin(t) {
      return this._get(t, this.plugins, "plugin");
    }
    getScale(t) {
      return this._get(t, this.scales, "scale");
    }
    removeControllers(...t) {
      this._each("unregister", t, this.controllers);
    }
    removeElements(...t) {
      this._each("unregister", t, this.elements);
    }
    removePlugins(...t) {
      this._each("unregister", t, this.plugins);
    }
    removeScales(...t) {
      this._each("unregister", t, this.scales);
    }
    _each(t, e, i) {
      [...e].forEach((e) => {
        const s = i || this._getRegistryForType(e);
        i || s.isForType(e) || (s === this.plugins && e.id)
          ? this._exec(t, s, e)
          : u(e, (e) => {
              const s = i || this._getRegistryForType(e);
              this._exec(t, s, e);
            });
      });
    }
    _exec(t, e, i) {
      const s = w(t);
      d(i["before" + s], [], i), e[t](i), d(i["after" + s], [], i);
    }
    _getRegistryForType(t) {
      for (let e = 0; e < this._typedRegistries.length; e++) {
        const i = this._typedRegistries[e];
        if (i.isForType(t)) return i;
      }
      return this.plugins;
    }
    _get(t, e, i) {
      const s = e.get(t);
      if (void 0 === s)
        throw new Error('"' + t + '" is not a registered ' + i + ".");
      return s;
    }
  }
  var en = new tn();
  class sn {
    constructor() {
      this._init = [];
    }
    notify(t, e, i, s) {
      "beforeInit" === e &&
        ((this._init = this._createDescriptors(t, !0)),
        this._notify(this._init, t, "install"));
      const n = s ? this._descriptors(t).filter(s) : this._descriptors(t),
        o = this._notify(n, t, e, i);
      return (
        "afterDestroy" === e &&
          (this._notify(n, t, "stop"),
          this._notify(this._init, t, "uninstall")),
        o
      );
    }
    _notify(t, e, i, s) {
      s = s || {};
      for (const n of t) {
        const t = n.plugin;
        if (!1 === d(t[i], [e, s, n.options], t) && s.cancelable) return !1;
      }
      return !0;
    }
    invalidate() {
      s(this._cache) ||
        ((this._oldCache = this._cache), (this._cache = void 0));
    }
    _descriptors(t) {
      if (this._cache) return this._cache;
      const e = (this._cache = this._createDescriptors(t));
      return this._notifyStateChanges(t), e;
    }
    _createDescriptors(t, e) {
      const i = t && t.config,
        s = l(i.options && i.options.plugins, {}),
        n = (function (t) {
          const e = {},
            i = [],
            s = Object.keys(en.plugins.items);
          for (let t = 0; t < s.length; t++) i.push(en.getPlugin(s[t]));
          const n = t.plugins || [];
          for (let t = 0; t < n.length; t++) {
            const s = n[t];
            -1 === i.indexOf(s) && (i.push(s), (e[s.id] = !0));
          }
          return { plugins: i, localIds: e };
        })(i);
      return !1 !== s || e
        ? (function (t, { plugins: e, localIds: i }, s, n) {
            const o = [],
              a = t.getContext();
            for (const r of e) {
              const e = r.id,
                l = nn(s[e], n);
              null !== l &&
                o.push({
                  plugin: r,
                  options: on(t.config, { plugin: r, local: i[e] }, l, a),
                });
            }
            return o;
          })(t, n, s, e)
        : [];
    }
    _notifyStateChanges(t) {
      const e = this._oldCache || [],
        i = this._cache,
        s = (t, e) =>
          t.filter((t) => !e.some((e) => t.plugin.id === e.plugin.id));
      this._notify(s(e, i), t, "stop"), this._notify(s(i, e), t, "start");
    }
  }
  function nn(t, e) {
    return e || !1 !== t ? (!0 === t ? {} : t) : null;
  }
  function on(t, { plugin: e, local: i }, s, n) {
    const o = t.pluginScopeKeys(e),
      a = t.getOptionScopes(s, o);
    return (
      i && e.defaults && a.push(e.defaults),
      t.createResolver(a, n, [""], {
        scriptable: !1,
        indexable: !1,
        allKeys: !0,
      })
    );
  }
  function an(t, e) {
    const i = ue.datasets[t] || {};
    return (
      ((e.datasets || {})[t] || {}).indexAxis ||
      e.indexAxis ||
      i.indexAxis ||
      "x"
    );
  }
  function rn(t) {
    if ("x" === t || "y" === t || "r" === t) return t;
  }
  function ln(t, ...e) {
    if (rn(t)) return t;
    for (const s of e) {
      const e =
        s.axis ||
        ("top" === (i = s.position) || "bottom" === i
          ? "x"
          : "left" === i || "right" === i
          ? "y"
          : void 0) ||
        (t.length > 1 && rn(t[0].toLowerCase()));
      if (e) return e;
    }
    var i;
    throw new Error(
      `Cannot determine type of '${t}' axis. Please provide 'axis' or 'position' option.`
    );
  }
  function hn(t, e, i) {
    if (i[e + "AxisID"] === t) return { axis: e };
  }
  function cn(t, e) {
    const i = re[t.type] || { scales: {} },
      s = e.scales || {},
      n = an(t.type, e),
      a = Object.create(null);
    return (
      Object.keys(s).forEach((e) => {
        const r = s[e];
        if (!o(r))
          return console.error(`Invalid scale configuration for scale: ${e}`);
        if (r._proxy)
          return console.warn(
            `Ignoring resolver passed as options for scale: ${e}`
          );
        const l = ln(
            e,
            r,
            (function (t, e) {
              if (e.data && e.data.datasets) {
                const i = e.data.datasets.filter(
                  (e) => e.xAxisID === t || e.yAxisID === t
                );
                if (i.length) return hn(t, "x", i[0]) || hn(t, "y", i[0]);
              }
              return {};
            })(e, t),
            ue.scales[r.type]
          ),
          h = (function (t, e) {
            return t === e ? "_index_" : "_value_";
          })(l, n),
          c = i.scales || {};
        a[e] = b(Object.create(null), [{ axis: l }, r, c[l], c[h]]);
      }),
      t.data.datasets.forEach((i) => {
        const n = i.type || t.type,
          o = i.indexAxis || an(n, e),
          r = (re[n] || {}).scales || {};
        Object.keys(r).forEach((t) => {
          const e = (function (t, e) {
              let i = t;
              return (
                "_index_" === t
                  ? (i = e)
                  : "_value_" === t && (i = "x" === e ? "y" : "x"),
                i
              );
            })(t, o),
            n = i[e + "AxisID"] || e;
          (a[n] = a[n] || Object.create(null)),
            b(a[n], [{ axis: e }, s[n], r[t]]);
        });
      }),
      Object.keys(a).forEach((t) => {
        const e = a[t];
        b(e, [ue.scales[e.type], ue.scale]);
      }),
      a
    );
  }
  function dn(t) {
    const e = t.options || (t.options = {});
    (e.plugins = l(e.plugins, {})), (e.scales = cn(t, e));
  }
  function un(t) {
    return (
      ((t = t || {}).datasets = t.datasets || []),
      (t.labels = t.labels || []),
      t
    );
  }
  const fn = new Map(),
    gn = new Set();
  function pn(t, e) {
    let i = fn.get(t);
    return i || ((i = e()), fn.set(t, i), gn.add(i)), i;
  }
  const mn = (t, e, i) => {
    const s = M(e, i);
    void 0 !== s && t.add(s);
  };
  class xn {
    constructor(t) {
      (this._config = (function (t) {
        return ((t = t || {}).data = un(t.data)), dn(t), t;
      })(t)),
        (this._scopeCache = new Map()),
        (this._resolverCache = new Map());
    }
    get platform() {
      return this._config.platform;
    }
    get type() {
      return this._config.type;
    }
    set type(t) {
      this._config.type = t;
    }
    get data() {
      return this._config.data;
    }
    set data(t) {
      this._config.data = un(t);
    }
    get options() {
      return this._config.options;
    }
    set options(t) {
      this._config.options = t;
    }
    get plugins() {
      return this._config.plugins;
    }
    update() {
      const t = this._config;
      this.clearCache(), dn(t);
    }
    clearCache() {
      this._scopeCache.clear(), this._resolverCache.clear();
    }
    datasetScopeKeys(t) {
      return pn(t, () => [[`datasets.${t}`, ""]]);
    }
    datasetAnimationScopeKeys(t, e) {
      return pn(`${t}.transition.${e}`, () => [
        [`datasets.${t}.transitions.${e}`, `transitions.${e}`],
        [`datasets.${t}`, ""],
      ]);
    }
    datasetElementScopeKeys(t, e) {
      return pn(`${t}-${e}`, () => [
        [`datasets.${t}.elements.${e}`, `datasets.${t}`, `elements.${e}`, ""],
      ]);
    }
    pluginScopeKeys(t) {
      const e = t.id;
      return pn(`${this.type}-plugin-${e}`, () => [
        [`plugins.${e}`, ...(t.additionalOptionScopes || [])],
      ]);
    }
    _cachedScopes(t, e) {
      const i = this._scopeCache;
      let s = i.get(t);
      return (s && !e) || ((s = new Map()), i.set(t, s)), s;
    }
    getOptionScopes(t, e, i) {
      const { options: s, type: n } = this,
        o = this._cachedScopes(t, i),
        a = o.get(e);
      if (a) return a;
      const r = new Set();
      e.forEach((e) => {
        t && (r.add(t), e.forEach((e) => mn(r, t, e))),
          e.forEach((t) => mn(r, s, t)),
          e.forEach((t) => mn(r, re[n] || {}, t)),
          e.forEach((t) => mn(r, ue, t)),
          e.forEach((t) => mn(r, le, t));
      });
      const l = Array.from(r);
      return (
        0 === l.length && l.push(Object.create(null)),
        gn.has(e) && o.set(e, l),
        l
      );
    }
    chartOptionScopes() {
      const { options: t, type: e } = this;
      return [t, re[e] || {}, ue.datasets[e] || {}, { type: e }, ue, le];
    }
    resolveNamedOptions(t, e, i, s = [""]) {
      const o = { $shared: !0 },
        { resolver: a, subPrefixes: r } = bn(this._resolverCache, t, s);
      let l = a;
      if (
        (function (t, e) {
          const { isScriptable: i, isIndexable: s } = Ye(t);
          for (const o of e) {
            const e = i(o),
              a = s(o),
              r = (a || e) && t[o];
            if ((e && (S(r) || _n(r))) || (a && n(r))) return !0;
          }
          return !1;
        })(a, e)
      ) {
        o.$shared = !1;
        l = $e(a, (i = S(i) ? i() : i), this.createResolver(t, i, r));
      }
      for (const t of e) o[t] = l[t];
      return o;
    }
    createResolver(t, e, i = [""], s) {
      const { resolver: n } = bn(this._resolverCache, t, i);
      return o(e) ? $e(n, e, void 0, s) : n;
    }
  }
  function bn(t, e, i) {
    let s = t.get(e);
    s || ((s = new Map()), t.set(e, s));
    const n = i.join();
    let o = s.get(n);
    if (!o) {
      (o = {
        resolver: je(e, i),
        subPrefixes: i.filter((t) => !t.toLowerCase().includes("hover")),
      }),
        s.set(n, o);
    }
    return o;
  }
  const _n = (t) => o(t) && Object.getOwnPropertyNames(t).some((e) => S(t[e]));
  const yn = ["top", "bottom", "left", "right", "chartArea"];
  function vn(t, e) {
    return "top" === t || "bottom" === t || (-1 === yn.indexOf(t) && "x" === e);
  }
  function Mn(t, e) {
    return function (i, s) {
      return i[t] === s[t] ? i[e] - s[e] : i[t] - s[t];
    };
  }
  function wn(t) {
    const e = t.chart,
      i = e.options.animation;
    e.notifyPlugins("afterRender"), d(i && i.onComplete, [t], e);
  }
  function kn(t) {
    const e = t.chart,
      i = e.options.animation;
    d(i && i.onProgress, [t], e);
  }
  function Sn(t) {
    return (
      fe() && "string" == typeof t
        ? (t = document.getElementById(t))
        : t && t.length && (t = t[0]),
      t && t.canvas && (t = t.canvas),
      t
    );
  }
  const Pn = {},
    Dn = (t) => {
      const e = Sn(t);
      return Object.values(Pn)
        .filter((t) => t.canvas === e)
        .pop();
    };
  function Cn(t, e, i) {
    const s = Object.keys(t);
    for (const n of s) {
      const s = +n;
      if (s >= e) {
        const o = t[n];
        delete t[n], (i > 0 || s > e) && (t[s + i] = o);
      }
    }
  }
  function On(t, e, i) {
    return t.options.clip ? t[i] : e[i];
  }
  class An {
    static defaults = ue;
    static instances = Pn;
    static overrides = re;
    static registry = en;
    static version = "4.4.4";
    static getChart = Dn;
    static register(...t) {
      en.add(...t), Tn();
    }
    static unregister(...t) {
      en.remove(...t), Tn();
    }
    constructor(t, e) {
      const s = (this.config = new xn(e)),
        n = Sn(t),
        o = Dn(n);
      if (o)
        throw new Error(
          "Canvas is already in use. Chart with ID '" +
            o.id +
            "' must be destroyed before the canvas with ID '" +
            o.canvas.id +
            "' can be reused."
        );
      const a = s.createResolver(s.chartOptionScopes(), this.getContext());
      (this.platform = new (s.platform || ks(n))()),
        this.platform.updateConfig(s);
      const r = this.platform.acquireContext(n, a.aspectRatio),
        l = r && r.canvas,
        h = l && l.height,
        c = l && l.width;
      (this.id = i()),
        (this.ctx = r),
        (this.canvas = l),
        (this.width = c),
        (this.height = h),
        (this._options = a),
        (this._aspectRatio = this.aspectRatio),
        (this._layers = []),
        (this._metasets = []),
        (this._stacks = void 0),
        (this.boxes = []),
        (this.currentDevicePixelRatio = void 0),
        (this.chartArea = void 0),
        (this._active = []),
        (this._lastEvent = void 0),
        (this._listeners = {}),
        (this._responsiveListeners = void 0),
        (this._sortedMetasets = []),
        (this.scales = {}),
        (this._plugins = new sn()),
        (this.$proxies = {}),
        (this._hiddenIndices = {}),
        (this.attached = !1),
        (this._animationsDisabled = void 0),
        (this.$context = void 0),
        (this._doResize = dt((t) => this.update(t), a.resizeDelay || 0)),
        (this._dataChanges = []),
        (Pn[this.id] = this),
        r && l
          ? (bt.listen(this, "complete", wn),
            bt.listen(this, "progress", kn),
            this._initialize(),
            this.attached && this.update())
          : console.error(
              "Failed to create chart: can't acquire context from the given item"
            );
    }
    get aspectRatio() {
      const {
        options: { aspectRatio: t, maintainAspectRatio: e },
        width: i,
        height: n,
        _aspectRatio: o,
      } = this;
      return s(t) ? (e && o ? o : n ? i / n : null) : t;
    }
    get data() {
      return this.config.data;
    }
    set data(t) {
      this.config.data = t;
    }
    get options() {
      return this._options;
    }
    set options(t) {
      this.config.options = t;
    }
    get registry() {
      return en;
    }
    _initialize() {
      return (
        this.notifyPlugins("beforeInit"),
        this.options.responsive
          ? this.resize()
          : ke(this, this.options.devicePixelRatio),
        this.bindEvents(),
        this.notifyPlugins("afterInit"),
        this
      );
    }
    clear() {
      return Te(this.canvas, this.ctx), this;
    }
    stop() {
      return bt.stop(this), this;
    }
    resize(t, e) {
      bt.running(this)
        ? (this._resizeBeforeDraw = { width: t, height: e })
        : this._resize(t, e);
    }
    _resize(t, e) {
      const i = this.options,
        s = this.canvas,
        n = i.maintainAspectRatio && this.aspectRatio,
        o = this.platform.getMaximumSize(s, t, e, n),
        a = i.devicePixelRatio || this.platform.getDevicePixelRatio(),
        r = this.width ? "resize" : "attach";
      (this.width = o.width),
        (this.height = o.height),
        (this._aspectRatio = this.aspectRatio),
        ke(this, a, !0) &&
          (this.notifyPlugins("resize", { size: o }),
          d(i.onResize, [this, o], this),
          this.attached && this._doResize(r) && this.render());
    }
    ensureScalesHaveIDs() {
      u(this.options.scales || {}, (t, e) => {
        t.id = e;
      });
    }
    buildOrUpdateScales() {
      const t = this.options,
        e = t.scales,
        i = this.scales,
        s = Object.keys(i).reduce((t, e) => ((t[e] = !1), t), {});
      let n = [];
      e &&
        (n = n.concat(
          Object.keys(e).map((t) => {
            const i = e[t],
              s = ln(t, i),
              n = "r" === s,
              o = "x" === s;
            return {
              options: i,
              dposition: n ? "chartArea" : o ? "bottom" : "left",
              dtype: n ? "radialLinear" : o ? "category" : "linear",
            };
          })
        )),
        u(n, (e) => {
          const n = e.options,
            o = n.id,
            a = ln(o, n),
            r = l(n.type, e.dtype);
          (void 0 !== n.position && vn(n.position, a) === vn(e.dposition)) ||
            (n.position = e.dposition),
            (s[o] = !0);
          let h = null;
          if (o in i && i[o].type === r) h = i[o];
          else {
            (h = new (en.getScale(r))({
              id: o,
              type: r,
              ctx: this.ctx,
              chart: this,
            })),
              (i[h.id] = h);
          }
          h.init(n, t);
        }),
        u(s, (t, e) => {
          t || delete i[e];
        }),
        u(i, (t) => {
          as.configure(this, t, t.options), as.addBox(this, t);
        });
    }
    _updateMetasets() {
      const t = this._metasets,
        e = this.data.datasets.length,
        i = t.length;
      if ((t.sort((t, e) => t.index - e.index), i > e)) {
        for (let t = e; t < i; ++t) this._destroyDatasetMeta(t);
        t.splice(e, i - e);
      }
      this._sortedMetasets = t.slice(0).sort(Mn("order", "index"));
    }
    _removeUnreferencedMetasets() {
      const {
        _metasets: t,
        data: { datasets: e },
      } = this;
      t.length > e.length && delete this._stacks,
        t.forEach((t, i) => {
          0 === e.filter((e) => e === t._dataset).length &&
            this._destroyDatasetMeta(i);
        });
    }
    buildOrUpdateControllers() {
      const t = [],
        e = this.data.datasets;
      let i, s;
      for (
        this._removeUnreferencedMetasets(), i = 0, s = e.length;
        i < s;
        i++
      ) {
        const s = e[i];
        let n = this.getDatasetMeta(i);
        const o = s.type || this.config.type;
        if (
          (n.type &&
            n.type !== o &&
            (this._destroyDatasetMeta(i), (n = this.getDatasetMeta(i))),
          (n.type = o),
          (n.indexAxis = s.indexAxis || an(o, this.options)),
          (n.order = s.order || 0),
          (n.index = i),
          (n.label = "" + s.label),
          (n.visible = this.isDatasetVisible(i)),
          n.controller)
        )
          n.controller.updateIndex(i), n.controller.linkScales();
        else {
          const e = en.getController(o),
            { datasetElementType: s, dataElementType: a } = ue.datasets[o];
          Object.assign(e, {
            dataElementType: en.getElement(a),
            datasetElementType: s && en.getElement(s),
          }),
            (n.controller = new e(this, i)),
            t.push(n.controller);
        }
      }
      return this._updateMetasets(), t;
    }
    _resetElements() {
      u(
        this.data.datasets,
        (t, e) => {
          this.getDatasetMeta(e).controller.reset();
        },
        this
      );
    }
    reset() {
      this._resetElements(), this.notifyPlugins("reset");
    }
    update(t) {
      const e = this.config;
      e.update();
      const i = (this._options = e.createResolver(
          e.chartOptionScopes(),
          this.getContext()
        )),
        s = (this._animationsDisabled = !i.animation);
      if (
        (this._updateScales(),
        this._checkEventBindings(),
        this._updateHiddenIndices(),
        this._plugins.invalidate(),
        !1 === this.notifyPlugins("beforeUpdate", { mode: t, cancelable: !0 }))
      )
        return;
      const n = this.buildOrUpdateControllers();
      this.notifyPlugins("beforeElementsUpdate");
      let o = 0;
      for (let t = 0, e = this.data.datasets.length; t < e; t++) {
        const { controller: e } = this.getDatasetMeta(t),
          i = !s && -1 === n.indexOf(e);
        e.buildOrUpdateElements(i), (o = Math.max(+e.getMaxOverflow(), o));
      }
      (o = this._minPadding = i.layout.autoPadding ? o : 0),
        this._updateLayout(o),
        s ||
          u(n, (t) => {
            t.reset();
          }),
        this._updateDatasets(t),
        this.notifyPlugins("afterUpdate", { mode: t }),
        this._layers.sort(Mn("z", "_idx"));
      const { _active: a, _lastEvent: r } = this;
      r
        ? this._eventHandler(r, !0)
        : a.length && this._updateHoverStyles(a, a, !0),
        this.render();
    }
    _updateScales() {
      u(this.scales, (t) => {
        as.removeBox(this, t);
      }),
        this.ensureScalesHaveIDs(),
        this.buildOrUpdateScales();
    }
    _checkEventBindings() {
      const t = this.options,
        e = new Set(Object.keys(this._listeners)),
        i = new Set(t.events);
      (P(e, i) && !!this._responsiveListeners === t.responsive) ||
        (this.unbindEvents(), this.bindEvents());
    }
    _updateHiddenIndices() {
      const { _hiddenIndices: t } = this,
        e = this._getUniformDataChanges() || [];
      for (const { method: i, start: s, count: n } of e) {
        Cn(t, s, "_removeElements" === i ? -n : n);
      }
    }
    _getUniformDataChanges() {
      const t = this._dataChanges;
      if (!t || !t.length) return;
      this._dataChanges = [];
      const e = this.data.datasets.length,
        i = (e) =>
          new Set(
            t
              .filter((t) => t[0] === e)
              .map((t, e) => e + "," + t.splice(1).join(","))
          ),
        s = i(0);
      for (let t = 1; t < e; t++) if (!P(s, i(t))) return;
      return Array.from(s)
        .map((t) => t.split(","))
        .map((t) => ({ method: t[1], start: +t[2], count: +t[3] }));
    }
    _updateLayout(t) {
      if (!1 === this.notifyPlugins("beforeLayout", { cancelable: !0 })) return;
      as.update(this, this.width, this.height, t);
      const e = this.chartArea,
        i = e.width <= 0 || e.height <= 0;
      (this._layers = []),
        u(
          this.boxes,
          (t) => {
            (i && "chartArea" === t.position) ||
              (t.configure && t.configure(), this._layers.push(...t._layers()));
          },
          this
        ),
        this._layers.forEach((t, e) => {
          t._idx = e;
        }),
        this.notifyPlugins("afterLayout");
    }
    _updateDatasets(t) {
      if (
        !1 !==
        this.notifyPlugins("beforeDatasetsUpdate", { mode: t, cancelable: !0 })
      ) {
        for (let t = 0, e = this.data.datasets.length; t < e; ++t)
          this.getDatasetMeta(t).controller.configure();
        for (let e = 0, i = this.data.datasets.length; e < i; ++e)
          this._updateDataset(e, S(t) ? t({ datasetIndex: e }) : t);
        this.notifyPlugins("afterDatasetsUpdate", { mode: t });
      }
    }
    _updateDataset(t, e) {
      const i = this.getDatasetMeta(t),
        s = { meta: i, index: t, mode: e, cancelable: !0 };
      !1 !== this.notifyPlugins("beforeDatasetUpdate", s) &&
        (i.controller._update(e),
        (s.cancelable = !1),
        this.notifyPlugins("afterDatasetUpdate", s));
    }
    render() {
      !1 !== this.notifyPlugins("beforeRender", { cancelable: !0 }) &&
        (bt.has(this)
          ? this.attached && !bt.running(this) && bt.start(this)
          : (this.draw(), wn({ chart: this })));
    }
    draw() {
      let t;
      if (this._resizeBeforeDraw) {
        const { width: t, height: e } = this._resizeBeforeDraw;
        (this._resizeBeforeDraw = null), this._resize(t, e);
      }
      if ((this.clear(), this.width <= 0 || this.height <= 0)) return;
      if (!1 === this.notifyPlugins("beforeDraw", { cancelable: !0 })) return;
      const e = this._layers;
      for (t = 0; t < e.length && e[t].z <= 0; ++t) e[t].draw(this.chartArea);
      for (this._drawDatasets(); t < e.length; ++t) e[t].draw(this.chartArea);
      this.notifyPlugins("afterDraw");
    }
    _getSortedDatasetMetas(t) {
      const e = this._sortedMetasets,
        i = [];
      let s, n;
      for (s = 0, n = e.length; s < n; ++s) {
        const n = e[s];
        (t && !n.visible) || i.push(n);
      }
      return i;
    }
    getSortedVisibleDatasetMetas() {
      return this._getSortedDatasetMetas(!0);
    }
    _drawDatasets() {
      if (!1 === this.notifyPlugins("beforeDatasetsDraw", { cancelable: !0 }))
        return;
      const t = this.getSortedVisibleDatasetMetas();
      for (let e = t.length - 1; e >= 0; --e) this._drawDataset(t[e]);
      this.notifyPlugins("afterDatasetsDraw");
    }
    _drawDataset(t) {
      const e = this.ctx,
        i = t._clip,
        s = !i.disabled,
        n = (function (t, e) {
          const { xScale: i, yScale: s } = t;
          return i && s
            ? {
                left: On(i, e, "left"),
                right: On(i, e, "right"),
                top: On(s, e, "top"),
                bottom: On(s, e, "bottom"),
              }
            : e;
        })(t, this.chartArea),
        o = { meta: t, index: t.index, cancelable: !0 };
      !1 !== this.notifyPlugins("beforeDatasetDraw", o) &&
        (s &&
          Ie(e, {
            left: !1 === i.left ? 0 : n.left - i.left,
            right: !1 === i.right ? this.width : n.right + i.right,
            top: !1 === i.top ? 0 : n.top - i.top,
            bottom: !1 === i.bottom ? this.height : n.bottom + i.bottom,
          }),
        t.controller.draw(),
        s && ze(e),
        (o.cancelable = !1),
        this.notifyPlugins("afterDatasetDraw", o));
    }
    isPointInArea(t) {
      return Re(t, this.chartArea, this._minPadding);
    }
    getElementsAtEventForMode(t, e, i, s) {
      const n = Xi.modes[e];
      return "function" == typeof n ? n(this, t, i, s) : [];
    }
    getDatasetMeta(t) {
      const e = this.data.datasets[t],
        i = this._metasets;
      let s = i.filter((t) => t && t._dataset === e).pop();
      return (
        s ||
          ((s = {
            type: null,
            data: [],
            dataset: null,
            controller: null,
            hidden: null,
            xAxisID: null,
            yAxisID: null,
            order: (e && e.order) || 0,
            index: t,
            _dataset: e,
            _parsed: [],
            _sorted: !1,
          }),
          i.push(s)),
        s
      );
    }
    getContext() {
      return (
        this.$context ||
        (this.$context = Ci(null, { chart: this, type: "chart" }))
      );
    }
    getVisibleDatasetCount() {
      return this.getSortedVisibleDatasetMetas().length;
    }
    isDatasetVisible(t) {
      const e = this.data.datasets[t];
      if (!e) return !1;
      const i = this.getDatasetMeta(t);
      return "boolean" == typeof i.hidden ? !i.hidden : !e.hidden;
    }
    setDatasetVisibility(t, e) {
      this.getDatasetMeta(t).hidden = !e;
    }
    toggleDataVisibility(t) {
      this._hiddenIndices[t] = !this._hiddenIndices[t];
    }
    getDataVisibility(t) {
      return !this._hiddenIndices[t];
    }
    _updateVisibility(t, e, i) {
      const s = i ? "show" : "hide",
        n = this.getDatasetMeta(t),
        o = n.controller._resolveAnimations(void 0, s);
      k(e)
        ? ((n.data[e].hidden = !i), this.update())
        : (this.setDatasetVisibility(t, i),
          o.update(n, { visible: i }),
          this.update((e) => (e.datasetIndex === t ? s : void 0)));
    }
    hide(t, e) {
      this._updateVisibility(t, e, !1);
    }
    show(t, e) {
      this._updateVisibility(t, e, !0);
    }
    _destroyDatasetMeta(t) {
      const e = this._metasets[t];
      e && e.controller && e.controller._destroy(), delete this._metasets[t];
    }
    _stop() {
      let t, e;
      for (
        this.stop(), bt.remove(this), t = 0, e = this.data.datasets.length;
        t < e;
        ++t
      )
        this._destroyDatasetMeta(t);
    }
    destroy() {
      this.notifyPlugins("beforeDestroy");
      const { canvas: t, ctx: e } = this;
      this._stop(),
        this.config.clearCache(),
        t &&
          (this.unbindEvents(),
          Te(t, e),
          this.platform.releaseContext(e),
          (this.canvas = null),
          (this.ctx = null)),
        delete Pn[this.id],
        this.notifyPlugins("afterDestroy");
    }
    toBase64Image(...t) {
      return this.canvas.toDataURL(...t);
    }
    bindEvents() {
      this.bindUserEvents(),
        this.options.responsive
          ? this.bindResponsiveEvents()
          : (this.attached = !0);
    }
    bindUserEvents() {
      const t = this._listeners,
        e = this.platform,
        i = (i, s) => {
          e.addEventListener(this, i, s), (t[i] = s);
        },
        s = (t, e, i) => {
          (t.offsetX = e), (t.offsetY = i), this._eventHandler(t);
        };
      u(this.options.events, (t) => i(t, s));
    }
    bindResponsiveEvents() {
      this._responsiveListeners || (this._responsiveListeners = {});
      const t = this._responsiveListeners,
        e = this.platform,
        i = (i, s) => {
          e.addEventListener(this, i, s), (t[i] = s);
        },
        s = (i, s) => {
          t[i] && (e.removeEventListener(this, i, s), delete t[i]);
        },
        n = (t, e) => {
          this.canvas && this.resize(t, e);
        };
      let o;
      const a = () => {
        s("attach", a),
          (this.attached = !0),
          this.resize(),
          i("resize", n),
          i("detach", o);
      };
      (o = () => {
        (this.attached = !1),
          s("resize", n),
          this._stop(),
          this._resize(0, 0),
          i("attach", a);
      }),
        e.isAttached(this.canvas) ? a() : o();
    }
    unbindEvents() {
      u(this._listeners, (t, e) => {
        this.platform.removeEventListener(this, e, t);
      }),
        (this._listeners = {}),
        u(this._responsiveListeners, (t, e) => {
          this.platform.removeEventListener(this, e, t);
        }),
        (this._responsiveListeners = void 0);
    }
    updateHoverStyle(t, e, i) {
      const s = i ? "set" : "remove";
      let n, o, a, r;
      for (
        "dataset" === e &&
          ((n = this.getDatasetMeta(t[0].datasetIndex)),
          n.controller["_" + s + "DatasetHoverStyle"]()),
          a = 0,
          r = t.length;
        a < r;
        ++a
      ) {
        o = t[a];
        const e = o && this.getDatasetMeta(o.datasetIndex).controller;
        e && e[s + "HoverStyle"](o.element, o.datasetIndex, o.index);
      }
    }
    getActiveElements() {
      return this._active || [];
    }
    setActiveElements(t) {
      const e = this._active || [],
        i = t.map(({ datasetIndex: t, index: e }) => {
          const i = this.getDatasetMeta(t);
          if (!i) throw new Error("No dataset found at index " + t);
          return { datasetIndex: t, element: i.data[e], index: e };
        });
      !f(i, e) &&
        ((this._active = i),
        (this._lastEvent = null),
        this._updateHoverStyles(i, e));
    }
    notifyPlugins(t, e, i) {
      return this._plugins.notify(this, t, e, i);
    }
    isPluginEnabled(t) {
      return 1 === this._plugins._cache.filter((e) => e.plugin.id === t).length;
    }
    _updateHoverStyles(t, e, i) {
      const s = this.options.hover,
        n = (t, e) =>
          t.filter(
            (t) =>
              !e.some(
                (e) => t.datasetIndex === e.datasetIndex && t.index === e.index
              )
          ),
        o = n(e, t),
        a = i ? t : n(t, e);
      o.length && this.updateHoverStyle(o, s.mode, !1),
        a.length && s.mode && this.updateHoverStyle(a, s.mode, !0);
    }
    _eventHandler(t, e) {
      const i = {
          event: t,
          replay: e,
          cancelable: !0,
          inChartArea: this.isPointInArea(t),
        },
        s = (e) =>
          (e.options.events || this.options.events).includes(t.native.type);
      if (!1 === this.notifyPlugins("beforeEvent", i, s)) return;
      const n = this._handleEvent(t, e, i.inChartArea);
      return (
        (i.cancelable = !1),
        this.notifyPlugins("afterEvent", i, s),
        (n || i.changed) && this.render(),
        this
      );
    }
    _handleEvent(t, e, i) {
      const { _active: s = [], options: n } = this,
        o = e,
        a = this._getActiveElements(t, s, i, o),
        r = D(t),
        l = (function (t, e, i, s) {
          return i && "mouseout" !== t.type ? (s ? e : t) : null;
        })(t, this._lastEvent, i, r);
      i &&
        ((this._lastEvent = null),
        d(n.onHover, [t, a, this], this),
        r && d(n.onClick, [t, a, this], this));
      const h = !f(a, s);
      return (
        (h || e) && ((this._active = a), this._updateHoverStyles(a, s, e)),
        (this._lastEvent = l),
        h
      );
    }
    _getActiveElements(t, e, i, s) {
      if ("mouseout" === t.type) return [];
      if (!i) return e;
      const n = this.options.hover;
      return this.getElementsAtEventForMode(t, n.mode, n, s);
    }
  }
  function Tn() {
    return u(An.instances, (t) => t._plugins.invalidate());
  }
  function Ln() {
    throw new Error(
      "This method is not implemented: Check that a complete date adapter is provided."
    );
  }
  class En {
    static override(t) {
      Object.assign(En.prototype, t);
    }
    options;
    constructor(t) {
      this.options = t || {};
    }
    init() {}
    formats() {
      return Ln();
    }
    parse() {
      return Ln();
    }
    format() {
      return Ln();
    }
    add() {
      return Ln();
    }
    diff() {
      return Ln();
    }
    startOf() {
      return Ln();
    }
    endOf() {
      return Ln();
    }
  }
  var Rn = { _date: En };
  function In(t) {
    const e = t.iScale,
      i = (function (t, e) {
        if (!t._cache.$bar) {
          const i = t.getMatchingVisibleMetas(e);
          let s = [];
          for (let e = 0, n = i.length; e < n; e++)
            s = s.concat(i[e].controller.getAllParsedValues(t));
          t._cache.$bar = lt(s.sort((t, e) => t - e));
        }
        return t._cache.$bar;
      })(e, t.type);
    let s,
      n,
      o,
      a,
      r = e._length;
    const l = () => {
      32767 !== o &&
        -32768 !== o &&
        (k(a) && (r = Math.min(r, Math.abs(o - a) || r)), (a = o));
    };
    for (s = 0, n = i.length; s < n; ++s) (o = e.getPixelForValue(i[s])), l();
    for (a = void 0, s = 0, n = e.ticks.length; s < n; ++s)
      (o = e.getPixelForTick(s)), l();
    return r;
  }
  function zn(t, e, i, s) {
    return (
      n(t)
        ? (function (t, e, i, s) {
            const n = i.parse(t[0], s),
              o = i.parse(t[1], s),
              a = Math.min(n, o),
              r = Math.max(n, o);
            let l = a,
              h = r;
            Math.abs(a) > Math.abs(r) && ((l = r), (h = a)),
              (e[i.axis] = h),
              (e._custom = {
                barStart: l,
                barEnd: h,
                start: n,
                end: o,
                min: a,
                max: r,
              });
          })(t, e, i, s)
        : (e[i.axis] = i.parse(t, s)),
      e
    );
  }
  function Fn(t, e, i, s) {
    const n = t.iScale,
      o = t.vScale,
      a = n.getLabels(),
      r = n === o,
      l = [];
    let h, c, d, u;
    for (h = i, c = i + s; h < c; ++h)
      (u = e[h]),
        (d = {}),
        (d[n.axis] = r || n.parse(a[h], h)),
        l.push(zn(u, d, o, h));
    return l;
  }
  function Vn(t) {
    return t && void 0 !== t.barStart && void 0 !== t.barEnd;
  }
  function Bn(t, e, i, s) {
    let n = e.borderSkipped;
    const o = {};
    if (!n) return void (t.borderSkipped = o);
    if (!0 === n)
      return void (t.borderSkipped = {
        top: !0,
        right: !0,
        bottom: !0,
        left: !0,
      });
    const {
      start: a,
      end: r,
      reverse: l,
      top: h,
      bottom: c,
    } = (function (t) {
      let e, i, s, n, o;
      return (
        t.horizontal
          ? ((e = t.base > t.x), (i = "left"), (s = "right"))
          : ((e = t.base < t.y), (i = "bottom"), (s = "top")),
        e ? ((n = "end"), (o = "start")) : ((n = "start"), (o = "end")),
        { start: i, end: s, reverse: e, top: n, bottom: o }
      );
    })(t);
    "middle" === n &&
      i &&
      ((t.enableBorderRadius = !0),
      (i._top || 0) === s
        ? (n = h)
        : (i._bottom || 0) === s
        ? (n = c)
        : ((o[Wn(c, a, r, l)] = !0), (n = h))),
      (o[Wn(n, a, r, l)] = !0),
      (t.borderSkipped = o);
  }
  function Wn(t, e, i, s) {
    var n, o, a;
    return (
      s
        ? ((a = i),
          (t = Nn((t = (n = t) === (o = e) ? a : n === a ? o : n), i, e)))
        : (t = Nn(t, e, i)),
      t
    );
  }
  function Nn(t, e, i) {
    return "start" === t ? e : "end" === t ? i : t;
  }
  function Hn(t, { inflateAmount: e }, i) {
    t.inflateAmount = "auto" === e ? (1 === i ? 0.33 : 0) : e;
  }
  class jn extends Ns {
    static id = "doughnut";
    static defaults = {
      datasetElementType: !1,
      dataElementType: "arc",
      animation: { animateRotate: !0, animateScale: !1 },
      animations: {
        numbers: {
          type: "number",
          properties: [
            "circumference",
            "endAngle",
            "innerRadius",
            "outerRadius",
            "startAngle",
            "x",
            "y",
            "offset",
            "borderWidth",
            "spacing",
          ],
        },
      },
      cutout: "50%",
      rotation: 0,
      circumference: 360,
      radius: "100%",
      spacing: 0,
      indexAxis: "r",
    };
    static descriptors = {
      _scriptable: (t) => "spacing" !== t,
      _indexable: (t) =>
        "spacing" !== t &&
        !t.startsWith("borderDash") &&
        !t.startsWith("hoverBorderDash"),
    };
    static overrides = {
      aspectRatio: 1,
      plugins: {
        legend: {
          labels: {
            generateLabels(t) {
              const e = t.data;
              if (e.labels.length && e.datasets.length) {
                const {
                  labels: { pointStyle: i, color: s },
                } = t.legend.options;
                return e.labels.map((e, n) => {
                  const o = t.getDatasetMeta(0).controller.getStyle(n);
                  return {
                    text: e,
                    fillStyle: o.backgroundColor,
                    strokeStyle: o.borderColor,
                    fontColor: s,
                    lineWidth: o.borderWidth,
                    pointStyle: i,
                    hidden: !t.getDataVisibility(n),
                    index: n,
                  };
                });
              }
              return [];
            },
          },
          onClick(t, e, i) {
            i.chart.toggleDataVisibility(e.index), i.chart.update();
          },
        },
      },
    };
    constructor(t, e) {
      super(t, e),
        (this.enableOptionSharing = !0),
        (this.innerRadius = void 0),
        (this.outerRadius = void 0),
        (this.offsetX = void 0),
        (this.offsetY = void 0);
    }
    linkScales() {}
    parse(t, e) {
      const i = this.getDataset().data,
        s = this._cachedMeta;
      if (!1 === this._parsing) s._parsed = i;
      else {
        let n,
          a,
          r = (t) => +i[t];
        if (o(i[t])) {
          const { key: t = "value" } = this._parsing;
          r = (e) => +M(i[e], t);
        }
        for (n = t, a = t + e; n < a; ++n) s._parsed[n] = r(n);
      }
    }
    _getRotation() {
      return $(this.options.rotation - 90);
    }
    _getCircumference() {
      return $(this.options.circumference);
    }
    _getRotationExtents() {
      let t = O,
        e = -O;
      for (let i = 0; i < this.chart.data.datasets.length; ++i)
        if (
          this.chart.isDatasetVisible(i) &&
          this.chart.getDatasetMeta(i).type === this._type
        ) {
          const s = this.chart.getDatasetMeta(i).controller,
            n = s._getRotation(),
            o = s._getCircumference();
          (t = Math.min(t, n)), (e = Math.max(e, n + o));
        }
      return { rotation: t, circumference: e - t };
    }
    update(t) {
      const e = this.chart,
        { chartArea: i } = e,
        s = this._cachedMeta,
        n = s.data,
        o =
          this.getMaxBorderWidth() +
          this.getMaxOffset(n) +
          this.options.spacing,
        a = Math.max((Math.min(i.width, i.height) - o) / 2, 0),
        r = Math.min(h(this.options.cutout, a), 1),
        l = this._getRingWeight(this.index),
        { circumference: d, rotation: u } = this._getRotationExtents(),
        {
          ratioX: f,
          ratioY: g,
          offsetX: p,
          offsetY: m,
        } = (function (t, e, i) {
          let s = 1,
            n = 1,
            o = 0,
            a = 0;
          if (e < O) {
            const r = t,
              l = r + e,
              h = Math.cos(r),
              c = Math.sin(r),
              d = Math.cos(l),
              u = Math.sin(l),
              f = (t, e, s) =>
                Z(t, r, l, !0) ? 1 : Math.max(e, e * i, s, s * i),
              g = (t, e, s) =>
                Z(t, r, l, !0) ? -1 : Math.min(e, e * i, s, s * i),
              p = f(0, h, d),
              m = f(E, c, u),
              x = g(C, h, d),
              b = g(C + E, c, u);
            (s = (p - x) / 2),
              (n = (m - b) / 2),
              (o = -(p + x) / 2),
              (a = -(m + b) / 2);
          }
          return { ratioX: s, ratioY: n, offsetX: o, offsetY: a };
        })(u, d, r),
        x = (i.width - o) / f,
        b = (i.height - o) / g,
        _ = Math.max(Math.min(x, b) / 2, 0),
        y = c(this.options.radius, _),
        v = (y - Math.max(y * r, 0)) / this._getVisibleDatasetWeightTotal();
      (this.offsetX = p * y),
        (this.offsetY = m * y),
        (s.total = this.calculateTotal()),
        (this.outerRadius = y - v * this._getRingWeightOffset(this.index)),
        (this.innerRadius = Math.max(this.outerRadius - v * l, 0)),
        this.updateElements(n, 0, n.length, t);
    }
    _circumference(t, e) {
      const i = this.options,
        s = this._cachedMeta,
        n = this._getCircumference();
      return (e && i.animation.animateRotate) ||
        !this.chart.getDataVisibility(t) ||
        null === s._parsed[t] ||
        s.data[t].hidden
        ? 0
        : this.calculateCircumference((s._parsed[t] * n) / O);
    }
    updateElements(t, e, i, s) {
      const n = "reset" === s,
        o = this.chart,
        a = o.chartArea,
        r = o.options.animation,
        l = (a.left + a.right) / 2,
        h = (a.top + a.bottom) / 2,
        c = n && r.animateScale,
        d = c ? 0 : this.innerRadius,
        u = c ? 0 : this.outerRadius,
        { sharedOptions: f, includeOptions: g } = this._getSharedOptions(e, s);
      let p,
        m = this._getRotation();
      for (p = 0; p < e; ++p) m += this._circumference(p, n);
      for (p = e; p < e + i; ++p) {
        const e = this._circumference(p, n),
          i = t[p],
          o = {
            x: l + this.offsetX,
            y: h + this.offsetY,
            startAngle: m,
            endAngle: m + e,
            circumference: e,
            outerRadius: u,
            innerRadius: d,
          };
        g &&
          (o.options =
            f || this.resolveDataElementOptions(p, i.active ? "active" : s)),
          (m += e),
          this.updateElement(i, p, o, s);
      }
    }
    calculateTotal() {
      const t = this._cachedMeta,
        e = t.data;
      let i,
        s = 0;
      for (i = 0; i < e.length; i++) {
        const n = t._parsed[i];
        null === n ||
          isNaN(n) ||
          !this.chart.getDataVisibility(i) ||
          e[i].hidden ||
          (s += Math.abs(n));
      }
      return s;
    }
    calculateCircumference(t) {
      const e = this._cachedMeta.total;
      return e > 0 && !isNaN(t) ? O * (Math.abs(t) / e) : 0;
    }
    getLabelAndValue(t) {
      const e = this._cachedMeta,
        i = this.chart,
        s = i.data.labels || [],
        n = ne(e._parsed[t], i.options.locale);
      return { label: s[t] || "", value: n };
    }
    getMaxBorderWidth(t) {
      let e = 0;
      const i = this.chart;
      let s, n, o, a, r;
      if (!t)
        for (s = 0, n = i.data.datasets.length; s < n; ++s)
          if (i.isDatasetVisible(s)) {
            (o = i.getDatasetMeta(s)), (t = o.data), (a = o.controller);
            break;
          }
      if (!t) return 0;
      for (s = 0, n = t.length; s < n; ++s)
        (r = a.resolveDataElementOptions(s)),
          "inner" !== r.borderAlign &&
            (e = Math.max(e, r.borderWidth || 0, r.hoverBorderWidth || 0));
      return e;
    }
    getMaxOffset(t) {
      let e = 0;
      for (let i = 0, s = t.length; i < s; ++i) {
        const t = this.resolveDataElementOptions(i);
        e = Math.max(e, t.offset || 0, t.hoverOffset || 0);
      }
      return e;
    }
    _getRingWeightOffset(t) {
      let e = 0;
      for (let i = 0; i < t; ++i)
        this.chart.isDatasetVisible(i) && (e += this._getRingWeight(i));
      return e;
    }
    _getRingWeight(t) {
      return Math.max(l(this.chart.data.datasets[t].weight, 1), 0);
    }
    _getVisibleDatasetWeightTotal() {
      return this._getRingWeightOffset(this.chart.data.datasets.length) || 1;
    }
  }
  class $n extends Ns {
    static id = "polarArea";
    static defaults = {
      dataElementType: "arc",
      animation: { animateRotate: !0, animateScale: !0 },
      animations: {
        numbers: {
          type: "number",
          properties: [
            "x",
            "y",
            "startAngle",
            "endAngle",
            "innerRadius",
            "outerRadius",
          ],
        },
      },
      indexAxis: "r",
      startAngle: 0,
    };
    static overrides = {
      aspectRatio: 1,
      plugins: {
        legend: {
          labels: {
            generateLabels(t) {
              const e = t.data;
              if (e.labels.length && e.datasets.length) {
                const {
                  labels: { pointStyle: i, color: s },
                } = t.legend.options;
                return e.labels.map((e, n) => {
                  const o = t.getDatasetMeta(0).controller.getStyle(n);
                  return {
                    text: e,
                    fillStyle: o.backgroundColor,
                    strokeStyle: o.borderColor,
                    fontColor: s,
                    lineWidth: o.borderWidth,
                    pointStyle: i,
                    hidden: !t.getDataVisibility(n),
                    index: n,
                  };
                });
              }
              return [];
            },
          },
          onClick(t, e, i) {
            i.chart.toggleDataVisibility(e.index), i.chart.update();
          },
        },
      },
      scales: {
        r: {
          type: "radialLinear",
          angleLines: { display: !1 },
          beginAtZero: !0,
          grid: { circular: !0 },
          pointLabels: { display: !1 },
          startAngle: 0,
        },
      },
    };
    constructor(t, e) {
      super(t, e), (this.innerRadius = void 0), (this.outerRadius = void 0);
    }
    getLabelAndValue(t) {
      const e = this._cachedMeta,
        i = this.chart,
        s = i.data.labels || [],
        n = ne(e._parsed[t].r, i.options.locale);
      return { label: s[t] || "", value: n };
    }
    parseObjectData(t, e, i, s) {
      return ii.bind(this)(t, e, i, s);
    }
    update(t) {
      const e = this._cachedMeta.data;
      this._updateRadius(), this.updateElements(e, 0, e.length, t);
    }
    getMinMax() {
      const t = this._cachedMeta,
        e = { min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY };
      return (
        t.data.forEach((t, i) => {
          const s = this.getParsed(i).r;
          !isNaN(s) &&
            this.chart.getDataVisibility(i) &&
            (s < e.min && (e.min = s), s > e.max && (e.max = s));
        }),
        e
      );
    }
    _updateRadius() {
      const t = this.chart,
        e = t.chartArea,
        i = t.options,
        s = Math.min(e.right - e.left, e.bottom - e.top),
        n = Math.max(s / 2, 0),
        o =
          (n -
            Math.max(
              i.cutoutPercentage ? (n / 100) * i.cutoutPercentage : 1,
              0
            )) /
          t.getVisibleDatasetCount();
      (this.outerRadius = n - o * this.index),
        (this.innerRadius = this.outerRadius - o);
    }
    updateElements(t, e, i, s) {
      const n = "reset" === s,
        o = this.chart,
        a = o.options.animation,
        r = this._cachedMeta.rScale,
        l = r.xCenter,
        h = r.yCenter,
        c = r.getIndexAngle(0) - 0.5 * C;
      let d,
        u = c;
      const f = 360 / this.countVisibleElements();
      for (d = 0; d < e; ++d) u += this._computeAngle(d, s, f);
      for (d = e; d < e + i; d++) {
        const e = t[d];
        let i = u,
          g = u + this._computeAngle(d, s, f),
          p = o.getDataVisibility(d)
            ? r.getDistanceFromCenterForValue(this.getParsed(d).r)
            : 0;
        (u = g),
          n && (a.animateScale && (p = 0), a.animateRotate && (i = g = c));
        const m = {
          x: l,
          y: h,
          innerRadius: 0,
          outerRadius: p,
          startAngle: i,
          endAngle: g,
          options: this.resolveDataElementOptions(d, e.active ? "active" : s),
        };
        this.updateElement(e, d, m, s);
      }
    }
    countVisibleElements() {
      const t = this._cachedMeta;
      let e = 0;
      return (
        t.data.forEach((t, i) => {
          !isNaN(this.getParsed(i).r) && this.chart.getDataVisibility(i) && e++;
        }),
        e
      );
    }
    _computeAngle(t, e, i) {
      return this.chart.getDataVisibility(t)
        ? $(this.resolveDataElementOptions(t, e).angle || i)
        : 0;
    }
  }
  var Yn = Object.freeze({
    __proto__: null,
    BarController: class extends Ns {
      static id = "bar";
      static defaults = {
        datasetElementType: !1,
        dataElementType: "bar",
        categoryPercentage: 0.8,
        barPercentage: 0.9,
        grouped: !0,
        animations: {
          numbers: {
            type: "number",
            properties: ["x", "y", "base", "width", "height"],
          },
        },
      };
      static overrides = {
        scales: {
          _index_: { type: "category", offset: !0, grid: { offset: !0 } },
          _value_: { type: "linear", beginAtZero: !0 },
        },
      };
      parsePrimitiveData(t, e, i, s) {
        return Fn(t, e, i, s);
      }
      parseArrayData(t, e, i, s) {
        return Fn(t, e, i, s);
      }
      parseObjectData(t, e, i, s) {
        const { iScale: n, vScale: o } = t,
          { xAxisKey: a = "x", yAxisKey: r = "y" } = this._parsing,
          l = "x" === n.axis ? a : r,
          h = "x" === o.axis ? a : r,
          c = [];
        let d, u, f, g;
        for (d = i, u = i + s; d < u; ++d)
          (g = e[d]),
            (f = {}),
            (f[n.axis] = n.parse(M(g, l), d)),
            c.push(zn(M(g, h), f, o, d));
        return c;
      }
      updateRangeFromParsed(t, e, i, s) {
        super.updateRangeFromParsed(t, e, i, s);
        const n = i._custom;
        n &&
          e === this._cachedMeta.vScale &&
          ((t.min = Math.min(t.min, n.min)), (t.max = Math.max(t.max, n.max)));
      }
      getMaxOverflow() {
        return 0;
      }
      getLabelAndValue(t) {
        const e = this._cachedMeta,
          { iScale: i, vScale: s } = e,
          n = this.getParsed(t),
          o = n._custom,
          a = Vn(o)
            ? "[" + o.start + ", " + o.end + "]"
            : "" + s.getLabelForValue(n[s.axis]);
        return { label: "" + i.getLabelForValue(n[i.axis]), value: a };
      }
      initialize() {
        (this.enableOptionSharing = !0), super.initialize();
        this._cachedMeta.stack = this.getDataset().stack;
      }
      update(t) {
        const e = this._cachedMeta;
        this.updateElements(e.data, 0, e.data.length, t);
      }
      updateElements(t, e, i, n) {
        const o = "reset" === n,
          {
            index: a,
            _cachedMeta: { vScale: r },
          } = this,
          l = r.getBasePixel(),
          h = r.isHorizontal(),
          c = this._getRuler(),
          { sharedOptions: d, includeOptions: u } = this._getSharedOptions(
            e,
            n
          );
        for (let f = e; f < e + i; f++) {
          const e = this.getParsed(f),
            i =
              o || s(e[r.axis])
                ? { base: l, head: l }
                : this._calculateBarValuePixels(f),
            g = this._calculateBarIndexPixels(f, c),
            p = (e._stacks || {})[r.axis],
            m = {
              horizontal: h,
              base: i.base,
              enableBorderRadius:
                !p || Vn(e._custom) || a === p._top || a === p._bottom,
              x: h ? i.head : g.center,
              y: h ? g.center : i.head,
              height: h ? g.size : Math.abs(i.size),
              width: h ? Math.abs(i.size) : g.size,
            };
          u &&
            (m.options =
              d ||
              this.resolveDataElementOptions(f, t[f].active ? "active" : n));
          const x = m.options || t[f].options;
          Bn(m, x, p, a), Hn(m, x, c.ratio), this.updateElement(t[f], f, m, n);
        }
      }
      _getStacks(t, e) {
        const { iScale: i } = this._cachedMeta,
          n = i
            .getMatchingVisibleMetas(this._type)
            .filter((t) => t.controller.options.grouped),
          o = i.options.stacked,
          a = [],
          r = this._cachedMeta.controller.getParsed(e),
          l = r && r[i.axis],
          h = (t) => {
            const e = t._parsed.find((t) => t[i.axis] === l),
              n = e && e[t.vScale.axis];
            if (s(n) || isNaN(n)) return !0;
          };
        for (const i of n)
          if (
            (void 0 === e || !h(i)) &&
            ((!1 === o ||
              -1 === a.indexOf(i.stack) ||
              (void 0 === o && void 0 === i.stack)) &&
              a.push(i.stack),
            i.index === t)
          )
            break;
        return a.length || a.push(void 0), a;
      }
      _getStackCount(t) {
        return this._getStacks(void 0, t).length;
      }
      _getStackIndex(t, e, i) {
        const s = this._getStacks(t, i),
          n = void 0 !== e ? s.indexOf(e) : -1;
        return -1 === n ? s.length - 1 : n;
      }
      _getRuler() {
        const t = this.options,
          e = this._cachedMeta,
          i = e.iScale,
          s = [];
        let n, o;
        for (n = 0, o = e.data.length; n < o; ++n)
          s.push(i.getPixelForValue(this.getParsed(n)[i.axis], n));
        const a = t.barThickness;
        return {
          min: a || In(e),
          pixels: s,
          start: i._startPixel,
          end: i._endPixel,
          stackCount: this._getStackCount(),
          scale: i,
          grouped: t.grouped,
          ratio: a ? 1 : t.categoryPercentage * t.barPercentage,
        };
      }
      _calculateBarValuePixels(t) {
        const {
            _cachedMeta: { vScale: e, _stacked: i, index: n },
            options: { base: o, minBarLength: a },
          } = this,
          r = o || 0,
          l = this.getParsed(t),
          h = l._custom,
          c = Vn(h);
        let d,
          u,
          f = l[e.axis],
          g = 0,
          p = i ? this.applyStack(e, l, i) : f;
        p !== f && ((g = p - f), (p = f)),
          c &&
            ((f = h.barStart),
            (p = h.barEnd - h.barStart),
            0 !== f && F(f) !== F(h.barEnd) && (g = 0),
            (g += f));
        const m = s(o) || c ? g : o;
        let x = e.getPixelForValue(m);
        if (
          ((d = this.chart.getDataVisibility(t)
            ? e.getPixelForValue(g + p)
            : x),
          (u = d - x),
          Math.abs(u) < a)
        ) {
          (u =
            (function (t, e, i) {
              return 0 !== t
                ? F(t)
                : (e.isHorizontal() ? 1 : -1) * (e.min >= i ? 1 : -1);
            })(u, e, r) * a),
            f === r && (x -= u / 2);
          const t = e.getPixelForDecimal(0),
            s = e.getPixelForDecimal(1),
            o = Math.min(t, s),
            h = Math.max(t, s);
          (x = Math.max(Math.min(x, h), o)),
            (d = x + u),
            i &&
              !c &&
              (l._stacks[e.axis]._visualValues[n] =
                e.getValueForPixel(d) - e.getValueForPixel(x));
        }
        if (x === e.getPixelForValue(r)) {
          const t = (F(u) * e.getLineWidthForValue(r)) / 2;
          (x += t), (u -= t);
        }
        return { size: u, base: x, head: d, center: d + u / 2 };
      }
      _calculateBarIndexPixels(t, e) {
        const i = e.scale,
          n = this.options,
          o = n.skipNull,
          a = l(n.maxBarThickness, 1 / 0);
        let r, h;
        if (e.grouped) {
          const i = o ? this._getStackCount(t) : e.stackCount,
            l =
              "flex" === n.barThickness
                ? (function (t, e, i, s) {
                    const n = e.pixels,
                      o = n[t];
                    let a = t > 0 ? n[t - 1] : null,
                      r = t < n.length - 1 ? n[t + 1] : null;
                    const l = i.categoryPercentage;
                    null === a &&
                      (a = o - (null === r ? e.end - e.start : r - o)),
                      null === r && (r = o + o - a);
                    const h = o - ((o - Math.min(a, r)) / 2) * l;
                    return {
                      chunk: ((Math.abs(r - a) / 2) * l) / s,
                      ratio: i.barPercentage,
                      start: h,
                    };
                  })(t, e, n, i)
                : (function (t, e, i, n) {
                    const o = i.barThickness;
                    let a, r;
                    return (
                      s(o)
                        ? ((a = e.min * i.categoryPercentage),
                          (r = i.barPercentage))
                        : ((a = o * n), (r = 1)),
                      { chunk: a / n, ratio: r, start: e.pixels[t] - a / 2 }
                    );
                  })(t, e, n, i),
            c = this._getStackIndex(
              this.index,
              this._cachedMeta.stack,
              o ? t : void 0
            );
          (r = l.start + l.chunk * c + l.chunk / 2),
            (h = Math.min(a, l.chunk * l.ratio));
        } else
          (r = i.getPixelForValue(this.getParsed(t)[i.axis], t)),
            (h = Math.min(a, e.min * e.ratio));
        return { base: r - h / 2, head: r + h / 2, center: r, size: h };
      }
      draw() {
        const t = this._cachedMeta,
          e = t.vScale,
          i = t.data,
          s = i.length;
        let n = 0;
        for (; n < s; ++n)
          null === this.getParsed(n)[e.axis] ||
            i[n].hidden ||
            i[n].draw(this._ctx);
      }
    },
    BubbleController: class extends Ns {
      static id = "bubble";
      static defaults = {
        datasetElementType: !1,
        dataElementType: "point",
        animations: {
          numbers: {
            type: "number",
            properties: ["x", "y", "borderWidth", "radius"],
          },
        },
      };
      static overrides = {
        scales: { x: { type: "linear" }, y: { type: "linear" } },
      };
      initialize() {
        (this.enableOptionSharing = !0), super.initialize();
      }
      parsePrimitiveData(t, e, i, s) {
        const n = super.parsePrimitiveData(t, e, i, s);
        for (let t = 0; t < n.length; t++)
          n[t]._custom = this.resolveDataElementOptions(t + i).radius;
        return n;
      }
      parseArrayData(t, e, i, s) {
        const n = super.parseArrayData(t, e, i, s);
        for (let t = 0; t < n.length; t++) {
          const s = e[i + t];
          n[t]._custom = l(s[2], this.resolveDataElementOptions(t + i).radius);
        }
        return n;
      }
      parseObjectData(t, e, i, s) {
        const n = super.parseObjectData(t, e, i, s);
        for (let t = 0; t < n.length; t++) {
          const s = e[i + t];
          n[t]._custom = l(
            s && s.r && +s.r,
            this.resolveDataElementOptions(t + i).radius
          );
        }
        return n;
      }
      getMaxOverflow() {
        const t = this._cachedMeta.data;
        let e = 0;
        for (let i = t.length - 1; i >= 0; --i)
          e = Math.max(e, t[i].size(this.resolveDataElementOptions(i)) / 2);
        return e > 0 && e;
      }
      getLabelAndValue(t) {
        const e = this._cachedMeta,
          i = this.chart.data.labels || [],
          { xScale: s, yScale: n } = e,
          o = this.getParsed(t),
          a = s.getLabelForValue(o.x),
          r = n.getLabelForValue(o.y),
          l = o._custom;
        return {
          label: i[t] || "",
          value: "(" + a + ", " + r + (l ? ", " + l : "") + ")",
        };
      }
      update(t) {
        const e = this._cachedMeta.data;
        this.updateElements(e, 0, e.length, t);
      }
      updateElements(t, e, i, s) {
        const n = "reset" === s,
          { iScale: o, vScale: a } = this._cachedMeta,
          { sharedOptions: r, includeOptions: l } = this._getSharedOptions(
            e,
            s
          ),
          h = o.axis,
          c = a.axis;
        for (let d = e; d < e + i; d++) {
          const e = t[d],
            i = !n && this.getParsed(d),
            u = {},
            f = (u[h] = n
              ? o.getPixelForDecimal(0.5)
              : o.getPixelForValue(i[h])),
            g = (u[c] = n ? a.getBasePixel() : a.getPixelForValue(i[c]));
          (u.skip = isNaN(f) || isNaN(g)),
            l &&
              ((u.options =
                r ||
                this.resolveDataElementOptions(d, e.active ? "active" : s)),
              n && (u.options.radius = 0)),
            this.updateElement(e, d, u, s);
        }
      }
      resolveDataElementOptions(t, e) {
        const i = this.getParsed(t);
        let s = super.resolveDataElementOptions(t, e);
        s.$shared && (s = Object.assign({}, s, { $shared: !1 }));
        const n = s.radius;
        return (
          "active" !== e && (s.radius = 0),
          (s.radius += l(i && i._custom, n)),
          s
        );
      }
    },
    DoughnutController: jn,
    LineController: class extends Ns {
      static id = "line";
      static defaults = {
        datasetElementType: "line",
        dataElementType: "point",
        showLine: !0,
        spanGaps: !1,
      };
      static overrides = {
        scales: { _index_: { type: "category" }, _value_: { type: "linear" } },
      };
      initialize() {
        (this.enableOptionSharing = !0),
          (this.supportsDecimation = !0),
          super.initialize();
      }
      update(t) {
        const e = this._cachedMeta,
          { dataset: i, data: s = [], _dataset: n } = e,
          o = this.chart._animationsDisabled;
        let { start: a, count: r } = pt(e, s, o);
        (this._drawStart = a),
          (this._drawCount = r),
          mt(e) && ((a = 0), (r = s.length)),
          (i._chart = this.chart),
          (i._datasetIndex = this.index),
          (i._decimated = !!n._decimated),
          (i.points = s);
        const l = this.resolveDatasetElementOptions(t);
        this.options.showLine || (l.borderWidth = 0),
          (l.segment = this.options.segment),
          this.updateElement(i, void 0, { animated: !o, options: l }, t),
          this.updateElements(s, a, r, t);
      }
      updateElements(t, e, i, n) {
        const o = "reset" === n,
          { iScale: a, vScale: r, _stacked: l, _dataset: h } = this._cachedMeta,
          { sharedOptions: c, includeOptions: d } = this._getSharedOptions(
            e,
            n
          ),
          u = a.axis,
          f = r.axis,
          { spanGaps: g, segment: p } = this.options,
          m = N(g) ? g : Number.POSITIVE_INFINITY,
          x = this.chart._animationsDisabled || o || "none" === n,
          b = e + i,
          _ = t.length;
        let y = e > 0 && this.getParsed(e - 1);
        for (let i = 0; i < _; ++i) {
          const g = t[i],
            _ = x ? g : {};
          if (i < e || i >= b) {
            _.skip = !0;
            continue;
          }
          const v = this.getParsed(i),
            M = s(v[f]),
            w = (_[u] = a.getPixelForValue(v[u], i)),
            k = (_[f] =
              o || M
                ? r.getBasePixel()
                : r.getPixelForValue(l ? this.applyStack(r, v, l) : v[f], i));
          (_.skip = isNaN(w) || isNaN(k) || M),
            (_.stop = i > 0 && Math.abs(v[u] - y[u]) > m),
            p && ((_.parsed = v), (_.raw = h.data[i])),
            d &&
              (_.options =
                c ||
                this.resolveDataElementOptions(i, g.active ? "active" : n)),
            x || this.updateElement(g, i, _, n),
            (y = v);
        }
      }
      getMaxOverflow() {
        const t = this._cachedMeta,
          e = t.dataset,
          i = (e.options && e.options.borderWidth) || 0,
          s = t.data || [];
        if (!s.length) return i;
        const n = s[0].size(this.resolveDataElementOptions(0)),
          o = s[s.length - 1].size(
            this.resolveDataElementOptions(s.length - 1)
          );
        return Math.max(i, n, o) / 2;
      }
      draw() {
        const t = this._cachedMeta;
        t.dataset.updateControlPoints(this.chart.chartArea, t.iScale.axis),
          super.draw();
      }
    },
    PieController: class extends jn {
      static id = "pie";
      static defaults = {
        cutout: 0,
        rotation: 0,
        circumference: 360,
        radius: "100%",
      };
    },
    PolarAreaController: $n,
    RadarController: class extends Ns {
      static id = "radar";
      static defaults = {
        datasetElementType: "line",
        dataElementType: "point",
        indexAxis: "r",
        showLine: !0,
        elements: { line: { fill: "start" } },
      };
      static overrides = {
        aspectRatio: 1,
        scales: { r: { type: "radialLinear" } },
      };
      getLabelAndValue(t) {
        const e = this._cachedMeta.vScale,
          i = this.getParsed(t);
        return {
          label: e.getLabels()[t],
          value: "" + e.getLabelForValue(i[e.axis]),
        };
      }
      parseObjectData(t, e, i, s) {
        return ii.bind(this)(t, e, i, s);
      }
      update(t) {
        const e = this._cachedMeta,
          i = e.dataset,
          s = e.data || [],
          n = e.iScale.getLabels();
        if (((i.points = s), "resize" !== t)) {
          const e = this.resolveDatasetElementOptions(t);
          this.options.showLine || (e.borderWidth = 0);
          const o = { _loop: !0, _fullLoop: n.length === s.length, options: e };
          this.updateElement(i, void 0, o, t);
        }
        this.updateElements(s, 0, s.length, t);
      }
      updateElements(t, e, i, s) {
        const n = this._cachedMeta.rScale,
          o = "reset" === s;
        for (let a = e; a < e + i; a++) {
          const e = t[a],
            i = this.resolveDataElementOptions(a, e.active ? "active" : s),
            r = n.getPointPositionForValue(a, this.getParsed(a).r),
            l = o ? n.xCenter : r.x,
            h = o ? n.yCenter : r.y,
            c = {
              x: l,
              y: h,
              angle: r.angle,
              skip: isNaN(l) || isNaN(h),
              options: i,
            };
          this.updateElement(e, a, c, s);
        }
      }
    },
    ScatterController: class extends Ns {
      static id = "scatter";
      static defaults = {
        datasetElementType: !1,
        dataElementType: "point",
        showLine: !1,
        fill: !1,
      };
      static overrides = {
        interaction: { mode: "point" },
        scales: { x: { type: "linear" }, y: { type: "linear" } },
      };
      getLabelAndValue(t) {
        const e = this._cachedMeta,
          i = this.chart.data.labels || [],
          { xScale: s, yScale: n } = e,
          o = this.getParsed(t),
          a = s.getLabelForValue(o.x),
          r = n.getLabelForValue(o.y);
        return { label: i[t] || "", value: "(" + a + ", " + r + ")" };
      }
      update(t) {
        const e = this._cachedMeta,
          { data: i = [] } = e,
          s = this.chart._animationsDisabled;
        let { start: n, count: o } = pt(e, i, s);
        if (
          ((this._drawStart = n),
          (this._drawCount = o),
          mt(e) && ((n = 0), (o = i.length)),
          this.options.showLine)
        ) {
          this.datasetElementType || this.addElements();
          const { dataset: n, _dataset: o } = e;
          (n._chart = this.chart),
            (n._datasetIndex = this.index),
            (n._decimated = !!o._decimated),
            (n.points = i);
          const a = this.resolveDatasetElementOptions(t);
          (a.segment = this.options.segment),
            this.updateElement(n, void 0, { animated: !s, options: a }, t);
        } else
          this.datasetElementType &&
            (delete e.dataset, (this.datasetElementType = !1));
        this.updateElements(i, n, o, t);
      }
      addElements() {
        const { showLine: t } = this.options;
        !this.datasetElementType &&
          t &&
          (this.datasetElementType = this.chart.registry.getElement("line")),
          super.addElements();
      }
      updateElements(t, e, i, n) {
        const o = "reset" === n,
          { iScale: a, vScale: r, _stacked: l, _dataset: h } = this._cachedMeta,
          c = this.resolveDataElementOptions(e, n),
          d = this.getSharedOptions(c),
          u = this.includeOptions(n, d),
          f = a.axis,
          g = r.axis,
          { spanGaps: p, segment: m } = this.options,
          x = N(p) ? p : Number.POSITIVE_INFINITY,
          b = this.chart._animationsDisabled || o || "none" === n;
        let _ = e > 0 && this.getParsed(e - 1);
        for (let c = e; c < e + i; ++c) {
          const e = t[c],
            i = this.getParsed(c),
            p = b ? e : {},
            y = s(i[g]),
            v = (p[f] = a.getPixelForValue(i[f], c)),
            M = (p[g] =
              o || y
                ? r.getBasePixel()
                : r.getPixelForValue(l ? this.applyStack(r, i, l) : i[g], c));
          (p.skip = isNaN(v) || isNaN(M) || y),
            (p.stop = c > 0 && Math.abs(i[f] - _[f]) > x),
            m && ((p.parsed = i), (p.raw = h.data[c])),
            u &&
              (p.options =
                d ||
                this.resolveDataElementOptions(c, e.active ? "active" : n)),
            b || this.updateElement(e, c, p, n),
            (_ = i);
        }
        this.updateSharedOptions(d, n, c);
      }
      getMaxOverflow() {
        const t = this._cachedMeta,
          e = t.data || [];
        if (!this.options.showLine) {
          let t = 0;
          for (let i = e.length - 1; i >= 0; --i)
            t = Math.max(t, e[i].size(this.resolveDataElementOptions(i)) / 2);
          return t > 0 && t;
        }
        const i = t.dataset,
          s = (i.options && i.options.borderWidth) || 0;
        if (!e.length) return s;
        const n = e[0].size(this.resolveDataElementOptions(0)),
          o = e[e.length - 1].size(
            this.resolveDataElementOptions(e.length - 1)
          );
        return Math.max(s, n, o) / 2;
      }
    },
  });
  function Un(t, e, i, s) {
    const n = vi(t.options.borderRadius, [
      "outerStart",
      "outerEnd",
      "innerStart",
      "innerEnd",
    ]);
    const o = (i - e) / 2,
      a = Math.min(o, (s * e) / 2),
      r = (t) => {
        const e = ((i - Math.min(o, t)) * s) / 2;
        return J(t, 0, Math.min(o, e));
      };
    return {
      outerStart: r(n.outerStart),
      outerEnd: r(n.outerEnd),
      innerStart: J(n.innerStart, 0, a),
      innerEnd: J(n.innerEnd, 0, a),
    };
  }
  function Xn(t, e, i, s) {
    return { x: i + t * Math.cos(e), y: s + t * Math.sin(e) };
  }
  function qn(t, e, i, s, n, o) {
    const { x: a, y: r, startAngle: l, pixelMargin: h, innerRadius: c } = e,
      d = Math.max(e.outerRadius + s + i - h, 0),
      u = c > 0 ? c + s + i + h : 0;
    let f = 0;
    const g = n - l;
    if (s) {
      const t = ((c > 0 ? c - s : 0) + (d > 0 ? d - s : 0)) / 2;
      f = (g - (0 !== t ? (g * t) / (t + s) : g)) / 2;
    }
    const p = (g - Math.max(0.001, g * d - i / C) / d) / 2,
      m = l + p + f,
      x = n - p - f,
      {
        outerStart: b,
        outerEnd: _,
        innerStart: y,
        innerEnd: v,
      } = Un(e, u, d, x - m),
      M = d - b,
      w = d - _,
      k = m + b / M,
      S = x - _ / w,
      P = u + y,
      D = u + v,
      O = m + y / P,
      A = x - v / D;
    if ((t.beginPath(), o)) {
      const e = (k + S) / 2;
      if ((t.arc(a, r, d, k, e), t.arc(a, r, d, e, S), _ > 0)) {
        const e = Xn(w, S, a, r);
        t.arc(e.x, e.y, _, S, x + E);
      }
      const i = Xn(D, x, a, r);
      if ((t.lineTo(i.x, i.y), v > 0)) {
        const e = Xn(D, A, a, r);
        t.arc(e.x, e.y, v, x + E, A + Math.PI);
      }
      const s = (x - v / u + (m + y / u)) / 2;
      if (
        (t.arc(a, r, u, x - v / u, s, !0),
        t.arc(a, r, u, s, m + y / u, !0),
        y > 0)
      ) {
        const e = Xn(P, O, a, r);
        t.arc(e.x, e.y, y, O + Math.PI, m - E);
      }
      const n = Xn(M, m, a, r);
      if ((t.lineTo(n.x, n.y), b > 0)) {
        const e = Xn(M, k, a, r);
        t.arc(e.x, e.y, b, m - E, k);
      }
    } else {
      t.moveTo(a, r);
      const e = Math.cos(k) * d + a,
        i = Math.sin(k) * d + r;
      t.lineTo(e, i);
      const s = Math.cos(S) * d + a,
        n = Math.sin(S) * d + r;
      t.lineTo(s, n);
    }
    t.closePath();
  }
  function Kn(t, e, i, s, n) {
    const { fullCircles: o, startAngle: a, circumference: r, options: l } = e,
      {
        borderWidth: h,
        borderJoinStyle: c,
        borderDash: d,
        borderDashOffset: u,
      } = l,
      f = "inner" === l.borderAlign;
    if (!h) return;
    t.setLineDash(d || []),
      (t.lineDashOffset = u),
      f
        ? ((t.lineWidth = 2 * h), (t.lineJoin = c || "round"))
        : ((t.lineWidth = h), (t.lineJoin = c || "bevel"));
    let g = e.endAngle;
    if (o) {
      qn(t, e, i, s, g, n);
      for (let e = 0; e < o; ++e) t.stroke();
      isNaN(r) || (g = a + (r % O || O));
    }
    f &&
      (function (t, e, i) {
        const {
          startAngle: s,
          pixelMargin: n,
          x: o,
          y: a,
          outerRadius: r,
          innerRadius: l,
        } = e;
        let h = n / r;
        t.beginPath(),
          t.arc(o, a, r, s - h, i + h),
          l > n
            ? ((h = n / l), t.arc(o, a, l, i + h, s - h, !0))
            : t.arc(o, a, n, i + E, s - E),
          t.closePath(),
          t.clip();
      })(t, e, g),
      o || (qn(t, e, i, s, g, n), t.stroke());
  }
  function Gn(t, e, i = e) {
    (t.lineCap = l(i.borderCapStyle, e.borderCapStyle)),
      t.setLineDash(l(i.borderDash, e.borderDash)),
      (t.lineDashOffset = l(i.borderDashOffset, e.borderDashOffset)),
      (t.lineJoin = l(i.borderJoinStyle, e.borderJoinStyle)),
      (t.lineWidth = l(i.borderWidth, e.borderWidth)),
      (t.strokeStyle = l(i.borderColor, e.borderColor));
  }
  function Zn(t, e, i) {
    t.lineTo(i.x, i.y);
  }
  function Jn(t, e, i = {}) {
    const s = t.length,
      { start: n = 0, end: o = s - 1 } = i,
      { start: a, end: r } = e,
      l = Math.max(n, a),
      h = Math.min(o, r),
      c = (n < a && o < a) || (n > r && o > r);
    return {
      count: s,
      start: l,
      loop: e.loop,
      ilen: h < l && !c ? s + h - l : h - l,
    };
  }
  function Qn(t, e, i, s) {
    const { points: n, options: o } = e,
      { count: a, start: r, loop: l, ilen: h } = Jn(n, i, s),
      c = (function (t) {
        return t.stepped
          ? Fe
          : t.tension || "monotone" === t.cubicInterpolationMode
          ? Ve
          : Zn;
      })(o);
    let d,
      u,
      f,
      { move: g = !0, reverse: p } = s || {};
    for (d = 0; d <= h; ++d)
      (u = n[(r + (p ? h - d : d)) % a]),
        u.skip ||
          (g ? (t.moveTo(u.x, u.y), (g = !1)) : c(t, f, u, p, o.stepped),
          (f = u));
    return l && ((u = n[(r + (p ? h : 0)) % a]), c(t, f, u, p, o.stepped)), !!l;
  }
  function to(t, e, i, s) {
    const n = e.points,
      { count: o, start: a, ilen: r } = Jn(n, i, s),
      { move: l = !0, reverse: h } = s || {};
    let c,
      d,
      u,
      f,
      g,
      p,
      m = 0,
      x = 0;
    const b = (t) => (a + (h ? r - t : t)) % o,
      _ = () => {
        f !== g && (t.lineTo(m, g), t.lineTo(m, f), t.lineTo(m, p));
      };
    for (l && ((d = n[b(0)]), t.moveTo(d.x, d.y)), c = 0; c <= r; ++c) {
      if (((d = n[b(c)]), d.skip)) continue;
      const e = d.x,
        i = d.y,
        s = 0 | e;
      s === u
        ? (i < f ? (f = i) : i > g && (g = i), (m = (x * m + e) / ++x))
        : (_(), t.lineTo(e, i), (u = s), (x = 0), (f = g = i)),
        (p = i);
    }
    _();
  }
  function eo(t) {
    const e = t.options,
      i = e.borderDash && e.borderDash.length;
    return !(
      t._decimated ||
      t._loop ||
      e.tension ||
      "monotone" === e.cubicInterpolationMode ||
      e.stepped ||
      i
    )
      ? to
      : Qn;
  }
  const io = "function" == typeof Path2D;
  function so(t, e, i, s) {
    io && !e.options.segment
      ? (function (t, e, i, s) {
          let n = e._path;
          n || ((n = e._path = new Path2D()), e.path(n, i, s) && n.closePath()),
            Gn(t, e.options),
            t.stroke(n);
        })(t, e, i, s)
      : (function (t, e, i, s) {
          const { segments: n, options: o } = e,
            a = eo(e);
          for (const r of n)
            Gn(t, o, r.style),
              t.beginPath(),
              a(t, e, r, { start: i, end: i + s - 1 }) && t.closePath(),
              t.stroke();
        })(t, e, i, s);
  }
  class no extends Hs {
    static id = "line";
    static defaults = {
      borderCapStyle: "butt",
      borderDash: [],
      borderDashOffset: 0,
      borderJoinStyle: "miter",
      borderWidth: 3,
      capBezierPoints: !0,
      cubicInterpolationMode: "default",
      fill: !1,
      spanGaps: !1,
      stepped: !1,
      tension: 0,
    };
    static defaultRoutes = {
      backgroundColor: "backgroundColor",
      borderColor: "borderColor",
    };
    static descriptors = {
      _scriptable: !0,
      _indexable: (t) => "borderDash" !== t && "fill" !== t,
    };
    constructor(t) {
      super(),
        (this.animated = !0),
        (this.options = void 0),
        (this._chart = void 0),
        (this._loop = void 0),
        (this._fullLoop = void 0),
        (this._path = void 0),
        (this._points = void 0),
        (this._segments = void 0),
        (this._decimated = !1),
        (this._pointsUpdated = !1),
        (this._datasetIndex = void 0),
        t && Object.assign(this, t);
    }
    updateControlPoints(t, e) {
      const i = this.options;
      if (
        (i.tension || "monotone" === i.cubicInterpolationMode) &&
        !i.stepped &&
        !this._pointsUpdated
      ) {
        const s = i.spanGaps ? this._loop : this._fullLoop;
        hi(this._points, i, t, s, e), (this._pointsUpdated = !0);
      }
    }
    set points(t) {
      (this._points = t),
        delete this._segments,
        delete this._path,
        (this._pointsUpdated = !1);
    }
    get points() {
      return this._points;
    }
    get segments() {
      return (
        this._segments || (this._segments = zi(this, this.options.segment))
      );
    }
    first() {
      const t = this.segments,
        e = this.points;
      return t.length && e[t[0].start];
    }
    last() {
      const t = this.segments,
        e = this.points,
        i = t.length;
      return i && e[t[i - 1].end];
    }
    interpolate(t, e) {
      const i = this.options,
        s = t[e],
        n = this.points,
        o = Ii(this, { property: e, start: s, end: s });
      if (!o.length) return;
      const a = [],
        r = (function (t) {
          return t.stepped
            ? pi
            : t.tension || "monotone" === t.cubicInterpolationMode
            ? mi
            : gi;
        })(i);
      let l, h;
      for (l = 0, h = o.length; l < h; ++l) {
        const { start: h, end: c } = o[l],
          d = n[h],
          u = n[c];
        if (d === u) {
          a.push(d);
          continue;
        }
        const f = r(d, u, Math.abs((s - d[e]) / (u[e] - d[e])), i.stepped);
        (f[e] = t[e]), a.push(f);
      }
      return 1 === a.length ? a[0] : a;
    }
    pathSegment(t, e, i) {
      return eo(this)(t, this, e, i);
    }
    path(t, e, i) {
      const s = this.segments,
        n = eo(this);
      let o = this._loop;
      (e = e || 0), (i = i || this.points.length - e);
      for (const a of s) o &= n(t, this, a, { start: e, end: e + i - 1 });
      return !!o;
    }
    draw(t, e, i, s) {
      const n = this.options || {};
      (this.points || []).length &&
        n.borderWidth &&
        (t.save(), so(t, this, i, s), t.restore()),
        this.animated && ((this._pointsUpdated = !1), (this._path = void 0));
    }
  }
  function oo(t, e, i, s) {
    const n = t.options,
      { [i]: o } = t.getProps([i], s);
    return Math.abs(e - o) < n.radius + n.hitRadius;
  }
  function ao(t, e) {
    const {
      x: i,
      y: s,
      base: n,
      width: o,
      height: a,
    } = t.getProps(["x", "y", "base", "width", "height"], e);
    let r, l, h, c, d;
    return (
      t.horizontal
        ? ((d = a / 2),
          (r = Math.min(i, n)),
          (l = Math.max(i, n)),
          (h = s - d),
          (c = s + d))
        : ((d = o / 2),
          (r = i - d),
          (l = i + d),
          (h = Math.min(s, n)),
          (c = Math.max(s, n))),
      { left: r, top: h, right: l, bottom: c }
    );
  }
  function ro(t, e, i, s) {
    return t ? 0 : J(e, i, s);
  }
  function lo(t) {
    const e = ao(t),
      i = e.right - e.left,
      s = e.bottom - e.top,
      n = (function (t, e, i) {
        const s = t.options.borderWidth,
          n = t.borderSkipped,
          o = Mi(s);
        return {
          t: ro(n.top, o.top, 0, i),
          r: ro(n.right, o.right, 0, e),
          b: ro(n.bottom, o.bottom, 0, i),
          l: ro(n.left, o.left, 0, e),
        };
      })(t, i / 2, s / 2),
      a = (function (t, e, i) {
        const { enableBorderRadius: s } = t.getProps(["enableBorderRadius"]),
          n = t.options.borderRadius,
          a = wi(n),
          r = Math.min(e, i),
          l = t.borderSkipped,
          h = s || o(n);
        return {
          topLeft: ro(!h || l.top || l.left, a.topLeft, 0, r),
          topRight: ro(!h || l.top || l.right, a.topRight, 0, r),
          bottomLeft: ro(!h || l.bottom || l.left, a.bottomLeft, 0, r),
          bottomRight: ro(!h || l.bottom || l.right, a.bottomRight, 0, r),
        };
      })(t, i / 2, s / 2);
    return {
      outer: { x: e.left, y: e.top, w: i, h: s, radius: a },
      inner: {
        x: e.left + n.l,
        y: e.top + n.t,
        w: i - n.l - n.r,
        h: s - n.t - n.b,
        radius: {
          topLeft: Math.max(0, a.topLeft - Math.max(n.t, n.l)),
          topRight: Math.max(0, a.topRight - Math.max(n.t, n.r)),
          bottomLeft: Math.max(0, a.bottomLeft - Math.max(n.b, n.l)),
          bottomRight: Math.max(0, a.bottomRight - Math.max(n.b, n.r)),
        },
      },
    };
  }
  function ho(t, e, i, s) {
    const n = null === e,
      o = null === i,
      a = t && !(n && o) && ao(t, s);
    return a && (n || tt(e, a.left, a.right)) && (o || tt(i, a.top, a.bottom));
  }
  function co(t, e) {
    t.rect(e.x, e.y, e.w, e.h);
  }
  function uo(t, e, i = {}) {
    const s = t.x !== i.x ? -e : 0,
      n = t.y !== i.y ? -e : 0,
      o = (t.x + t.w !== i.x + i.w ? e : 0) - s,
      a = (t.y + t.h !== i.y + i.h ? e : 0) - n;
    return { x: t.x + s, y: t.y + n, w: t.w + o, h: t.h + a, radius: t.radius };
  }
  var fo = Object.freeze({
    __proto__: null,
    ArcElement: class extends Hs {
      static id = "arc";
      static defaults = {
        borderAlign: "center",
        borderColor: "#fff",
        borderDash: [],
        borderDashOffset: 0,
        borderJoinStyle: void 0,
        borderRadius: 0,
        borderWidth: 2,
        offset: 0,
        spacing: 0,
        angle: void 0,
        circular: !0,
      };
      static defaultRoutes = { backgroundColor: "backgroundColor" };
      static descriptors = {
        _scriptable: !0,
        _indexable: (t) => "borderDash" !== t,
      };
      circumference;
      endAngle;
      fullCircles;
      innerRadius;
      outerRadius;
      pixelMargin;
      startAngle;
      constructor(t) {
        super(),
          (this.options = void 0),
          (this.circumference = void 0),
          (this.startAngle = void 0),
          (this.endAngle = void 0),
          (this.innerRadius = void 0),
          (this.outerRadius = void 0),
          (this.pixelMargin = 0),
          (this.fullCircles = 0),
          t && Object.assign(this, t);
      }
      inRange(t, e, i) {
        const s = this.getProps(["x", "y"], i),
          { angle: n, distance: o } = X(s, { x: t, y: e }),
          {
            startAngle: a,
            endAngle: r,
            innerRadius: h,
            outerRadius: c,
            circumference: d,
          } = this.getProps(
            [
              "startAngle",
              "endAngle",
              "innerRadius",
              "outerRadius",
              "circumference",
            ],
            i
          ),
          u = (this.options.spacing + this.options.borderWidth) / 2,
          f = l(d, r - a),
          g = Z(n, a, r) && a !== r,
          p = f >= O || g,
          m = tt(o, h + u, c + u);
        return p && m;
      }
      getCenterPoint(t) {
        const {
            x: e,
            y: i,
            startAngle: s,
            endAngle: n,
            innerRadius: o,
            outerRadius: a,
          } = this.getProps(
            ["x", "y", "startAngle", "endAngle", "innerRadius", "outerRadius"],
            t
          ),
          { offset: r, spacing: l } = this.options,
          h = (s + n) / 2,
          c = (o + a + l + r) / 2;
        return { x: e + Math.cos(h) * c, y: i + Math.sin(h) * c };
      }
      tooltipPosition(t) {
        return this.getCenterPoint(t);
      }
      draw(t) {
        const { options: e, circumference: i } = this,
          s = (e.offset || 0) / 4,
          n = (e.spacing || 0) / 2,
          o = e.circular;
        if (
          ((this.pixelMargin = "inner" === e.borderAlign ? 0.33 : 0),
          (this.fullCircles = i > O ? Math.floor(i / O) : 0),
          0 === i || this.innerRadius < 0 || this.outerRadius < 0)
        )
          return;
        t.save();
        const a = (this.startAngle + this.endAngle) / 2;
        t.translate(Math.cos(a) * s, Math.sin(a) * s);
        const r = s * (1 - Math.sin(Math.min(C, i || 0)));
        (t.fillStyle = e.backgroundColor),
          (t.strokeStyle = e.borderColor),
          (function (t, e, i, s, n) {
            const { fullCircles: o, startAngle: a, circumference: r } = e;
            let l = e.endAngle;
            if (o) {
              qn(t, e, i, s, l, n);
              for (let e = 0; e < o; ++e) t.fill();
              isNaN(r) || (l = a + (r % O || O));
            }
            qn(t, e, i, s, l, n), t.fill();
          })(t, this, r, n, o),
          Kn(t, this, r, n, o),
          t.restore();
      }
    },
    BarElement: class extends Hs {
      static id = "bar";
      static defaults = {
        borderSkipped: "start",
        borderWidth: 0,
        borderRadius: 0,
        inflateAmount: "auto",
        pointStyle: void 0,
      };
      static defaultRoutes = {
        backgroundColor: "backgroundColor",
        borderColor: "borderColor",
      };
      constructor(t) {
        super(),
          (this.options = void 0),
          (this.horizontal = void 0),
          (this.base = void 0),
          (this.width = void 0),
          (this.height = void 0),
          (this.inflateAmount = void 0),
          t && Object.assign(this, t);
      }
      draw(t) {
        const {
            inflateAmount: e,
            options: { borderColor: i, backgroundColor: s },
          } = this,
          { inner: n, outer: o } = lo(this),
          a =
            (r = o.radius).topLeft ||
            r.topRight ||
            r.bottomLeft ||
            r.bottomRight
              ? He
              : co;
        var r;
        t.save(),
          (o.w === n.w && o.h === n.h) ||
            (t.beginPath(),
            a(t, uo(o, e, n)),
            t.clip(),
            a(t, uo(n, -e, o)),
            (t.fillStyle = i),
            t.fill("evenodd")),
          t.beginPath(),
          a(t, uo(n, e)),
          (t.fillStyle = s),
          t.fill(),
          t.restore();
      }
      inRange(t, e, i) {
        return ho(this, t, e, i);
      }
      inXRange(t, e) {
        return ho(this, t, null, e);
      }
      inYRange(t, e) {
        return ho(this, null, t, e);
      }
      getCenterPoint(t) {
        const {
          x: e,
          y: i,
          base: s,
          horizontal: n,
        } = this.getProps(["x", "y", "base", "horizontal"], t);
        return { x: n ? (e + s) / 2 : e, y: n ? i : (i + s) / 2 };
      }
      getRange(t) {
        return "x" === t ? this.width / 2 : this.height / 2;
      }
    },
    LineElement: no,
    PointElement: class extends Hs {
      static id = "point";
      parsed;
      skip;
      stop;
      static defaults = {
        borderWidth: 1,
        hitRadius: 1,
        hoverBorderWidth: 1,
        hoverRadius: 4,
        pointStyle: "circle",
        radius: 3,
        rotation: 0,
      };
      static defaultRoutes = {
        backgroundColor: "backgroundColor",
        borderColor: "borderColor",
      };
      constructor(t) {
        super(),
          (this.options = void 0),
          (this.parsed = void 0),
          (this.skip = void 0),
          (this.stop = void 0),
          t && Object.assign(this, t);
      }
      inRange(t, e, i) {
        const s = this.options,
          { x: n, y: o } = this.getProps(["x", "y"], i);
        return (
          Math.pow(t - n, 2) + Math.pow(e - o, 2) <
          Math.pow(s.hitRadius + s.radius, 2)
        );
      }
      inXRange(t, e) {
        return oo(this, t, "x", e);
      }
      inYRange(t, e) {
        return oo(this, t, "y", e);
      }
      getCenterPoint(t) {
        const { x: e, y: i } = this.getProps(["x", "y"], t);
        return { x: e, y: i };
      }
      size(t) {
        let e = (t = t || this.options || {}).radius || 0;
        e = Math.max(e, (e && t.hoverRadius) || 0);
        return 2 * (e + ((e && t.borderWidth) || 0));
      }
      draw(t, e) {
        const i = this.options;
        this.skip ||
          i.radius < 0.1 ||
          !Re(this, e, this.size(i) / 2) ||
          ((t.strokeStyle = i.borderColor),
          (t.lineWidth = i.borderWidth),
          (t.fillStyle = i.backgroundColor),
          Le(t, i, this.x, this.y));
      }
      getRange() {
        const t = this.options || {};
        return t.radius + t.hitRadius;
      }
    },
  });
  function go(t, e, i, s) {
    const n = t.indexOf(e);
    if (-1 === n)
      return ((t, e, i, s) => (
        "string" == typeof e
          ? ((i = t.push(e) - 1), s.unshift({ index: i, label: e }))
          : isNaN(e) && (i = null),
        i
      ))(t, e, i, s);
    return n !== t.lastIndexOf(e) ? i : n;
  }
  function po(t) {
    const e = this.getLabels();
    return t >= 0 && t < e.length ? e[t] : t;
  }
  function mo(t, e, { horizontal: i, minRotation: s }) {
    const n = $(s),
      o = (i ? Math.sin(n) : Math.cos(n)) || 0.001,
      a = 0.75 * e * ("" + t).length;
    return Math.min(e / o, a);
  }
  class xo extends Js {
    constructor(t) {
      super(t),
        (this.start = void 0),
        (this.end = void 0),
        (this._startValue = void 0),
        (this._endValue = void 0),
        (this._valueRange = 0);
    }
    parse(t, e) {
      return s(t) ||
        (("number" == typeof t || t instanceof Number) && !isFinite(+t))
        ? null
        : +t;
    }
    handleTickRangeOptions() {
      const { beginAtZero: t } = this.options,
        { minDefined: e, maxDefined: i } = this.getUserBounds();
      let { min: s, max: n } = this;
      const o = (t) => (s = e ? s : t),
        a = (t) => (n = i ? n : t);
      if (t) {
        const t = F(s),
          e = F(n);
        t < 0 && e < 0 ? a(0) : t > 0 && e > 0 && o(0);
      }
      if (s === n) {
        let e = 0 === n ? 1 : Math.abs(0.05 * n);
        a(n + e), t || o(s - e);
      }
      (this.min = s), (this.max = n);
    }
    getTickLimit() {
      const t = this.options.ticks;
      let e,
        { maxTicksLimit: i, stepSize: s } = t;
      return (
        s
          ? ((e = Math.ceil(this.max / s) - Math.floor(this.min / s) + 1),
            e > 1e3 &&
              (console.warn(
                `scales.${this.id}.ticks.stepSize: ${s} would result generating up to ${e} ticks. Limiting to 1000.`
              ),
              (e = 1e3)))
          : ((e = this.computeTickLimit()), (i = i || 11)),
        i && (e = Math.min(i, e)),
        e
      );
    }
    computeTickLimit() {
      return Number.POSITIVE_INFINITY;
    }
    buildTicks() {
      const t = this.options,
        e = t.ticks;
      let i = this.getTickLimit();
      i = Math.max(2, i);
      const n = (function (t, e) {
        const i = [],
          {
            bounds: n,
            step: o,
            min: a,
            max: r,
            precision: l,
            count: h,
            maxTicks: c,
            maxDigits: d,
            includeBounds: u,
          } = t,
          f = o || 1,
          g = c - 1,
          { min: p, max: m } = e,
          x = !s(a),
          b = !s(r),
          _ = !s(h),
          y = (m - p) / (d + 1);
        let v,
          M,
          w,
          k,
          S = B((m - p) / g / f) * f;
        if (S < 1e-14 && !x && !b) return [{ value: p }, { value: m }];
        (k = Math.ceil(m / S) - Math.floor(p / S)),
          k > g && (S = B((k * S) / g / f) * f),
          s(l) || ((v = Math.pow(10, l)), (S = Math.ceil(S * v) / v)),
          "ticks" === n
            ? ((M = Math.floor(p / S) * S), (w = Math.ceil(m / S) * S))
            : ((M = p), (w = m)),
          x && b && o && H((r - a) / o, S / 1e3)
            ? ((k = Math.round(Math.min((r - a) / S, c))),
              (S = (r - a) / k),
              (M = a),
              (w = r))
            : _
            ? ((M = x ? a : M), (w = b ? r : w), (k = h - 1), (S = (w - M) / k))
            : ((k = (w - M) / S),
              (k = V(k, Math.round(k), S / 1e3)
                ? Math.round(k)
                : Math.ceil(k)));
        const P = Math.max(U(S), U(M));
        (v = Math.pow(10, s(l) ? P : l)),
          (M = Math.round(M * v) / v),
          (w = Math.round(w * v) / v);
        let D = 0;
        for (
          x &&
          (u && M !== a
            ? (i.push({ value: a }),
              M < a && D++,
              V(Math.round((M + D * S) * v) / v, a, mo(a, y, t)) && D++)
            : M < a && D++);
          D < k;
          ++D
        ) {
          const t = Math.round((M + D * S) * v) / v;
          if (b && t > r) break;
          i.push({ value: t });
        }
        return (
          b && u && w !== r
            ? i.length && V(i[i.length - 1].value, r, mo(r, y, t))
              ? (i[i.length - 1].value = r)
              : i.push({ value: r })
            : (b && w !== r) || i.push({ value: w }),
          i
        );
      })(
        {
          maxTicks: i,
          bounds: t.bounds,
          min: t.min,
          max: t.max,
          precision: e.precision,
          step: e.stepSize,
          count: e.count,
          maxDigits: this._maxDigits(),
          horizontal: this.isHorizontal(),
          minRotation: e.minRotation || 0,
          includeBounds: !1 !== e.includeBounds,
        },
        this._range || this
      );
      return (
        "ticks" === t.bounds && j(n, this, "value"),
        t.reverse
          ? (n.reverse(), (this.start = this.max), (this.end = this.min))
          : ((this.start = this.min), (this.end = this.max)),
        n
      );
    }
    configure() {
      const t = this.ticks;
      let e = this.min,
        i = this.max;
      if ((super.configure(), this.options.offset && t.length)) {
        const s = (i - e) / Math.max(t.length - 1, 1) / 2;
        (e -= s), (i += s);
      }
      (this._startValue = e), (this._endValue = i), (this._valueRange = i - e);
    }
    getLabelForValue(t) {
      return ne(t, this.chart.options.locale, this.options.ticks.format);
    }
  }
  class bo extends xo {
    static id = "linear";
    static defaults = { ticks: { callback: ae.formatters.numeric } };
    determineDataLimits() {
      const { min: t, max: e } = this.getMinMax(!0);
      (this.min = a(t) ? t : 0),
        (this.max = a(e) ? e : 1),
        this.handleTickRangeOptions();
    }
    computeTickLimit() {
      const t = this.isHorizontal(),
        e = t ? this.width : this.height,
        i = $(this.options.ticks.minRotation),
        s = (t ? Math.sin(i) : Math.cos(i)) || 0.001,
        n = this._resolveTickFontOptions(0);
      return Math.ceil(e / Math.min(40, n.lineHeight / s));
    }
    getPixelForValue(t) {
      return null === t
        ? NaN
        : this.getPixelForDecimal((t - this._startValue) / this._valueRange);
    }
    getValueForPixel(t) {
      return this._startValue + this.getDecimalForPixel(t) * this._valueRange;
    }
  }
  const _o = (t) => Math.floor(z(t)),
    yo = (t, e) => Math.pow(10, _o(t) + e);
  function vo(t) {
    return 1 === t / Math.pow(10, _o(t));
  }
  function Mo(t, e, i) {
    const s = Math.pow(10, i),
      n = Math.floor(t / s);
    return Math.ceil(e / s) - n;
  }
  function wo(t, { min: e, max: i }) {
    e = r(t.min, e);
    const s = [],
      n = _o(e);
    let o = (function (t, e) {
        let i = _o(e - t);
        for (; Mo(t, e, i) > 10; ) i++;
        for (; Mo(t, e, i) < 10; ) i--;
        return Math.min(i, _o(t));
      })(e, i),
      a = o < 0 ? Math.pow(10, Math.abs(o)) : 1;
    const l = Math.pow(10, o),
      h = n > o ? Math.pow(10, n) : 0,
      c = Math.round((e - h) * a) / a,
      d = Math.floor((e - h) / l / 10) * l * 10;
    let u = Math.floor((c - d) / Math.pow(10, o)),
      f = r(t.min, Math.round((h + d + u * Math.pow(10, o)) * a) / a);
    for (; f < i; )
      s.push({ value: f, major: vo(f), significand: u }),
        u >= 10 ? (u = u < 15 ? 15 : 20) : u++,
        u >= 20 && (o++, (u = 2), (a = o >= 0 ? 1 : a)),
        (f = Math.round((h + d + u * Math.pow(10, o)) * a) / a);
    const g = r(t.max, f);
    return s.push({ value: g, major: vo(g), significand: u }), s;
  }
  class ko extends Js {
    static id = "logarithmic";
    static defaults = {
      ticks: { callback: ae.formatters.logarithmic, major: { enabled: !0 } },
    };
    constructor(t) {
      super(t),
        (this.start = void 0),
        (this.end = void 0),
        (this._startValue = void 0),
        (this._valueRange = 0);
    }
    parse(t, e) {
      const i = xo.prototype.parse.apply(this, [t, e]);
      if (0 !== i) return a(i) && i > 0 ? i : null;
      this._zero = !0;
    }
    determineDataLimits() {
      const { min: t, max: e } = this.getMinMax(!0);
      (this.min = a(t) ? Math.max(0, t) : null),
        (this.max = a(e) ? Math.max(0, e) : null),
        this.options.beginAtZero && (this._zero = !0),
        this._zero &&
          this.min !== this._suggestedMin &&
          !a(this._userMin) &&
          (this.min =
            t === yo(this.min, 0) ? yo(this.min, -1) : yo(this.min, 0)),
        this.handleTickRangeOptions();
    }
    handleTickRangeOptions() {
      const { minDefined: t, maxDefined: e } = this.getUserBounds();
      let i = this.min,
        s = this.max;
      const n = (e) => (i = t ? i : e),
        o = (t) => (s = e ? s : t);
      i === s && (i <= 0 ? (n(1), o(10)) : (n(yo(i, -1)), o(yo(s, 1)))),
        i <= 0 && n(yo(s, -1)),
        s <= 0 && o(yo(i, 1)),
        (this.min = i),
        (this.max = s);
    }
    buildTicks() {
      const t = this.options,
        e = wo({ min: this._userMin, max: this._userMax }, this);
      return (
        "ticks" === t.bounds && j(e, this, "value"),
        t.reverse
          ? (e.reverse(), (this.start = this.max), (this.end = this.min))
          : ((this.start = this.min), (this.end = this.max)),
        e
      );
    }
    getLabelForValue(t) {
      return void 0 === t
        ? "0"
        : ne(t, this.chart.options.locale, this.options.ticks.format);
    }
    configure() {
      const t = this.min;
      super.configure(),
        (this._startValue = z(t)),
        (this._valueRange = z(this.max) - z(t));
    }
    getPixelForValue(t) {
      return (
        (void 0 !== t && 0 !== t) || (t = this.min),
        null === t || isNaN(t)
          ? NaN
          : this.getPixelForDecimal(
              t === this.min ? 0 : (z(t) - this._startValue) / this._valueRange
            )
      );
    }
    getValueForPixel(t) {
      const e = this.getDecimalForPixel(t);
      return Math.pow(10, this._startValue + e * this._valueRange);
    }
  }
  function So(t) {
    const e = t.ticks;
    if (e.display && t.display) {
      const t = ki(e.backdropPadding);
      return l(e.font && e.font.size, ue.font.size) + t.height;
    }
    return 0;
  }
  function Po(t, e, i, s, n) {
    return t === s || t === n
      ? { start: e - i / 2, end: e + i / 2 }
      : t < s || t > n
      ? { start: e - i, end: e }
      : { start: e, end: e + i };
  }
  function Do(t) {
    const e = {
        l: t.left + t._padding.left,
        r: t.right - t._padding.right,
        t: t.top + t._padding.top,
        b: t.bottom - t._padding.bottom,
      },
      i = Object.assign({}, e),
      s = [],
      o = [],
      a = t._pointLabels.length,
      r = t.options.pointLabels,
      l = r.centerPointLabels ? C / a : 0;
    for (let u = 0; u < a; u++) {
      const a = r.setContext(t.getPointLabelContext(u));
      o[u] = a.padding;
      const f = t.getPointPosition(u, t.drawingArea + o[u], l),
        g = Si(a.font),
        p =
          ((h = t.ctx),
          (c = g),
          (d = n((d = t._pointLabels[u])) ? d : [d]),
          { w: Oe(h, c.string, d), h: d.length * c.lineHeight });
      s[u] = p;
      const m = G(t.getIndexAngle(u) + l),
        x = Math.round(Y(m));
      Co(i, e, m, Po(x, f.x, p.w, 0, 180), Po(x, f.y, p.h, 90, 270));
    }
    var h, c, d;
    t.setCenterPoint(e.l - i.l, i.r - e.r, e.t - i.t, i.b - e.b),
      (t._pointLabelItems = (function (t, e, i) {
        const s = [],
          n = t._pointLabels.length,
          o = t.options,
          { centerPointLabels: a, display: r } = o.pointLabels,
          l = { extra: So(o) / 2, additionalAngle: a ? C / n : 0 };
        let h;
        for (let o = 0; o < n; o++) {
          (l.padding = i[o]), (l.size = e[o]);
          const n = Oo(t, o, l);
          s.push(n),
            "auto" === r && ((n.visible = Ao(n, h)), n.visible && (h = n));
        }
        return s;
      })(t, s, o));
  }
  function Co(t, e, i, s, n) {
    const o = Math.abs(Math.sin(i)),
      a = Math.abs(Math.cos(i));
    let r = 0,
      l = 0;
    s.start < e.l
      ? ((r = (e.l - s.start) / o), (t.l = Math.min(t.l, e.l - r)))
      : s.end > e.r &&
        ((r = (s.end - e.r) / o), (t.r = Math.max(t.r, e.r + r))),
      n.start < e.t
        ? ((l = (e.t - n.start) / a), (t.t = Math.min(t.t, e.t - l)))
        : n.end > e.b &&
          ((l = (n.end - e.b) / a), (t.b = Math.max(t.b, e.b + l)));
  }
  function Oo(t, e, i) {
    const s = t.drawingArea,
      { extra: n, additionalAngle: o, padding: a, size: r } = i,
      l = t.getPointPosition(e, s + n + a, o),
      h = Math.round(Y(G(l.angle + E))),
      c = (function (t, e, i) {
        90 === i || 270 === i ? (t -= e / 2) : (i > 270 || i < 90) && (t -= e);
        return t;
      })(l.y, r.h, h),
      d = (function (t) {
        if (0 === t || 180 === t) return "center";
        if (t < 180) return "left";
        return "right";
      })(h),
      u = (function (t, e, i) {
        "right" === i ? (t -= e) : "center" === i && (t -= e / 2);
        return t;
      })(l.x, r.w, d);
    return {
      visible: !0,
      x: l.x,
      y: c,
      textAlign: d,
      left: u,
      top: c,
      right: u + r.w,
      bottom: c + r.h,
    };
  }
  function Ao(t, e) {
    if (!e) return !0;
    const { left: i, top: s, right: n, bottom: o } = t;
    return !(
      Re({ x: i, y: s }, e) ||
      Re({ x: i, y: o }, e) ||
      Re({ x: n, y: s }, e) ||
      Re({ x: n, y: o }, e)
    );
  }
  function To(t, e, i) {
    const { left: n, top: o, right: a, bottom: r } = i,
      { backdropColor: l } = e;
    if (!s(l)) {
      const i = wi(e.borderRadius),
        s = ki(e.backdropPadding);
      t.fillStyle = l;
      const h = n - s.left,
        c = o - s.top,
        d = a - n + s.width,
        u = r - o + s.height;
      Object.values(i).some((t) => 0 !== t)
        ? (t.beginPath(),
          He(t, { x: h, y: c, w: d, h: u, radius: i }),
          t.fill())
        : t.fillRect(h, c, d, u);
    }
  }
  function Lo(t, e, i, s) {
    const { ctx: n } = t;
    if (i) n.arc(t.xCenter, t.yCenter, e, 0, O);
    else {
      let i = t.getPointPosition(0, e);
      n.moveTo(i.x, i.y);
      for (let o = 1; o < s; o++)
        (i = t.getPointPosition(o, e)), n.lineTo(i.x, i.y);
    }
  }
  class Eo extends xo {
    static id = "radialLinear";
    static defaults = {
      display: !0,
      animate: !0,
      position: "chartArea",
      angleLines: {
        display: !0,
        lineWidth: 1,
        borderDash: [],
        borderDashOffset: 0,
      },
      grid: { circular: !1 },
      startAngle: 0,
      ticks: { showLabelBackdrop: !0, callback: ae.formatters.numeric },
      pointLabels: {
        backdropColor: void 0,
        backdropPadding: 2,
        display: !0,
        font: { size: 10 },
        callback: (t) => t,
        padding: 5,
        centerPointLabels: !1,
      },
    };
    static defaultRoutes = {
      "angleLines.color": "borderColor",
      "pointLabels.color": "color",
      "ticks.color": "color",
    };
    static descriptors = { angleLines: { _fallback: "grid" } };
    constructor(t) {
      super(t),
        (this.xCenter = void 0),
        (this.yCenter = void 0),
        (this.drawingArea = void 0),
        (this._pointLabels = []),
        (this._pointLabelItems = []);
    }
    setDimensions() {
      const t = (this._padding = ki(So(this.options) / 2)),
        e = (this.width = this.maxWidth - t.width),
        i = (this.height = this.maxHeight - t.height);
      (this.xCenter = Math.floor(this.left + e / 2 + t.left)),
        (this.yCenter = Math.floor(this.top + i / 2 + t.top)),
        (this.drawingArea = Math.floor(Math.min(e, i) / 2));
    }
    determineDataLimits() {
      const { min: t, max: e } = this.getMinMax(!1);
      (this.min = a(t) && !isNaN(t) ? t : 0),
        (this.max = a(e) && !isNaN(e) ? e : 0),
        this.handleTickRangeOptions();
    }
    computeTickLimit() {
      return Math.ceil(this.drawingArea / So(this.options));
    }
    generateTickLabels(t) {
      xo.prototype.generateTickLabels.call(this, t),
        (this._pointLabels = this.getLabels()
          .map((t, e) => {
            const i = d(this.options.pointLabels.callback, [t, e], this);
            return i || 0 === i ? i : "";
          })
          .filter((t, e) => this.chart.getDataVisibility(e)));
    }
    fit() {
      const t = this.options;
      t.display && t.pointLabels.display
        ? Do(this)
        : this.setCenterPoint(0, 0, 0, 0);
    }
    setCenterPoint(t, e, i, s) {
      (this.xCenter += Math.floor((t - e) / 2)),
        (this.yCenter += Math.floor((i - s) / 2)),
        (this.drawingArea -= Math.min(
          this.drawingArea / 2,
          Math.max(t, e, i, s)
        ));
    }
    getIndexAngle(t) {
      return G(
        t * (O / (this._pointLabels.length || 1)) +
          $(this.options.startAngle || 0)
      );
    }
    getDistanceFromCenterForValue(t) {
      if (s(t)) return NaN;
      const e = this.drawingArea / (this.max - this.min);
      return this.options.reverse ? (this.max - t) * e : (t - this.min) * e;
    }
    getValueForDistanceFromCenter(t) {
      if (s(t)) return NaN;
      const e = t / (this.drawingArea / (this.max - this.min));
      return this.options.reverse ? this.max - e : this.min + e;
    }
    getPointLabelContext(t) {
      const e = this._pointLabels || [];
      if (t >= 0 && t < e.length) {
        const i = e[t];
        return (function (t, e, i) {
          return Ci(t, { label: i, index: e, type: "pointLabel" });
        })(this.getContext(), t, i);
      }
    }
    getPointPosition(t, e, i = 0) {
      const s = this.getIndexAngle(t) - E + i;
      return {
        x: Math.cos(s) * e + this.xCenter,
        y: Math.sin(s) * e + this.yCenter,
        angle: s,
      };
    }
    getPointPositionForValue(t, e) {
      return this.getPointPosition(t, this.getDistanceFromCenterForValue(e));
    }
    getBasePosition(t) {
      return this.getPointPositionForValue(t || 0, this.getBaseValue());
    }
    getPointLabelPosition(t) {
      const { left: e, top: i, right: s, bottom: n } = this._pointLabelItems[t];
      return { left: e, top: i, right: s, bottom: n };
    }
    drawBackground() {
      const {
        backgroundColor: t,
        grid: { circular: e },
      } = this.options;
      if (t) {
        const i = this.ctx;
        i.save(),
          i.beginPath(),
          Lo(
            this,
            this.getDistanceFromCenterForValue(this._endValue),
            e,
            this._pointLabels.length
          ),
          i.closePath(),
          (i.fillStyle = t),
          i.fill(),
          i.restore();
      }
    }
    drawGrid() {
      const t = this.ctx,
        e = this.options,
        { angleLines: i, grid: s, border: n } = e,
        o = this._pointLabels.length;
      let a, r, l;
      if (
        (e.pointLabels.display &&
          (function (t, e) {
            const {
              ctx: i,
              options: { pointLabels: s },
            } = t;
            for (let n = e - 1; n >= 0; n--) {
              const e = t._pointLabelItems[n];
              if (!e.visible) continue;
              const o = s.setContext(t.getPointLabelContext(n));
              To(i, o, e);
              const a = Si(o.font),
                { x: r, y: l, textAlign: h } = e;
              Ne(i, t._pointLabels[n], r, l + a.lineHeight / 2, a, {
                color: o.color,
                textAlign: h,
                textBaseline: "middle",
              });
            }
          })(this, o),
        s.display &&
          this.ticks.forEach((t, e) => {
            if (0 !== e || (0 === e && this.min < 0)) {
              r = this.getDistanceFromCenterForValue(t.value);
              const i = this.getContext(e),
                a = s.setContext(i),
                l = n.setContext(i);
              !(function (t, e, i, s, n) {
                const o = t.ctx,
                  a = e.circular,
                  { color: r, lineWidth: l } = e;
                (!a && !s) ||
                  !r ||
                  !l ||
                  i < 0 ||
                  (o.save(),
                  (o.strokeStyle = r),
                  (o.lineWidth = l),
                  o.setLineDash(n.dash),
                  (o.lineDashOffset = n.dashOffset),
                  o.beginPath(),
                  Lo(t, i, a, s),
                  o.closePath(),
                  o.stroke(),
                  o.restore());
              })(this, a, r, o, l);
            }
          }),
        i.display)
      ) {
        for (t.save(), a = o - 1; a >= 0; a--) {
          const s = i.setContext(this.getPointLabelContext(a)),
            { color: n, lineWidth: o } = s;
          o &&
            n &&
            ((t.lineWidth = o),
            (t.strokeStyle = n),
            t.setLineDash(s.borderDash),
            (t.lineDashOffset = s.borderDashOffset),
            (r = this.getDistanceFromCenterForValue(
              e.reverse ? this.min : this.max
            )),
            (l = this.getPointPosition(a, r)),
            t.beginPath(),
            t.moveTo(this.xCenter, this.yCenter),
            t.lineTo(l.x, l.y),
            t.stroke());
        }
        t.restore();
      }
    }
    drawBorder() {}
    drawLabels() {
      const t = this.ctx,
        e = this.options,
        i = e.ticks;
      if (!i.display) return;
      const s = this.getIndexAngle(0);
      let n, o;
      t.save(),
        t.translate(this.xCenter, this.yCenter),
        t.rotate(s),
        (t.textAlign = "center"),
        (t.textBaseline = "middle"),
        this.ticks.forEach((s, a) => {
          if (0 === a && this.min >= 0 && !e.reverse) return;
          const r = i.setContext(this.getContext(a)),
            l = Si(r.font);
          if (
            ((n = this.getDistanceFromCenterForValue(this.ticks[a].value)),
            r.showLabelBackdrop)
          ) {
            (t.font = l.string),
              (o = t.measureText(s.label).width),
              (t.fillStyle = r.backdropColor);
            const e = ki(r.backdropPadding);
            t.fillRect(
              -o / 2 - e.left,
              -n - l.size / 2 - e.top,
              o + e.width,
              l.size + e.height
            );
          }
          Ne(t, s.label, 0, -n, l, {
            color: r.color,
            strokeColor: r.textStrokeColor,
            strokeWidth: r.textStrokeWidth,
          });
        }),
        t.restore();
    }
    drawTitle() {}
  }
  const Ro = {
      millisecond: { common: !0, size: 1, steps: 1e3 },
      second: { common: !0, size: 1e3, steps: 60 },
      minute: { common: !0, size: 6e4, steps: 60 },
      hour: { common: !0, size: 36e5, steps: 24 },
      day: { common: !0, size: 864e5, steps: 30 },
      week: { common: !1, size: 6048e5, steps: 4 },
      month: { common: !0, size: 2628e6, steps: 12 },
      quarter: { common: !1, size: 7884e6, steps: 4 },
      year: { common: !0, size: 3154e7 },
    },
    Io = Object.keys(Ro);
  function zo(t, e) {
    return t - e;
  }
  function Fo(t, e) {
    if (s(e)) return null;
    const i = t._adapter,
      { parser: n, round: o, isoWeekday: r } = t._parseOpts;
    let l = e;
    return (
      "function" == typeof n && (l = n(l)),
      a(l) || (l = "string" == typeof n ? i.parse(l, n) : i.parse(l)),
      null === l
        ? null
        : (o &&
            (l =
              "week" !== o || (!N(r) && !0 !== r)
                ? i.startOf(l, o)
                : i.startOf(l, "isoWeek", r)),
          +l)
    );
  }
  function Vo(t, e, i, s) {
    const n = Io.length;
    for (let o = Io.indexOf(t); o < n - 1; ++o) {
      const t = Ro[Io[o]],
        n = t.steps ? t.steps : Number.MAX_SAFE_INTEGER;
      if (t.common && Math.ceil((i - e) / (n * t.size)) <= s) return Io[o];
    }
    return Io[n - 1];
  }
  function Bo(t, e, i) {
    if (i) {
      if (i.length) {
        const { lo: s, hi: n } = et(i, e);
        t[i[s] >= e ? i[s] : i[n]] = !0;
      }
    } else t[e] = !0;
  }
  function Wo(t, e, i) {
    const s = [],
      n = {},
      o = e.length;
    let a, r;
    for (a = 0; a < o; ++a)
      (r = e[a]), (n[r] = a), s.push({ value: r, major: !1 });
    return 0 !== o && i
      ? (function (t, e, i, s) {
          const n = t._adapter,
            o = +n.startOf(e[0].value, s),
            a = e[e.length - 1].value;
          let r, l;
          for (r = o; r <= a; r = +n.add(r, 1, s))
            (l = i[r]), l >= 0 && (e[l].major = !0);
          return e;
        })(t, s, n, i)
      : s;
  }
  class No extends Js {
    static id = "time";
    static defaults = {
      bounds: "data",
      adapters: {},
      time: {
        parser: !1,
        unit: !1,
        round: !1,
        isoWeekday: !1,
        minUnit: "millisecond",
        displayFormats: {},
      },
      ticks: { source: "auto", callback: !1, major: { enabled: !1 } },
    };
    constructor(t) {
      super(t),
        (this._cache = { data: [], labels: [], all: [] }),
        (this._unit = "day"),
        (this._majorUnit = void 0),
        (this._offsets = {}),
        (this._normalized = !1),
        (this._parseOpts = void 0);
    }
    init(t, e = {}) {
      const i = t.time || (t.time = {}),
        s = (this._adapter = new Rn._date(t.adapters.date));
      s.init(e),
        b(i.displayFormats, s.formats()),
        (this._parseOpts = {
          parser: i.parser,
          round: i.round,
          isoWeekday: i.isoWeekday,
        }),
        super.init(t),
        (this._normalized = e.normalized);
    }
    parse(t, e) {
      return void 0 === t ? null : Fo(this, t);
    }
    beforeLayout() {
      super.beforeLayout(), (this._cache = { data: [], labels: [], all: [] });
    }
    determineDataLimits() {
      const t = this.options,
        e = this._adapter,
        i = t.time.unit || "day";
      let {
        min: s,
        max: n,
        minDefined: o,
        maxDefined: r,
      } = this.getUserBounds();
      function l(t) {
        o || isNaN(t.min) || (s = Math.min(s, t.min)),
          r || isNaN(t.max) || (n = Math.max(n, t.max));
      }
      (o && r) ||
        (l(this._getLabelBounds()),
        ("ticks" === t.bounds && "labels" === t.ticks.source) ||
          l(this.getMinMax(!1))),
        (s = a(s) && !isNaN(s) ? s : +e.startOf(Date.now(), i)),
        (n = a(n) && !isNaN(n) ? n : +e.endOf(Date.now(), i) + 1),
        (this.min = Math.min(s, n - 1)),
        (this.max = Math.max(s + 1, n));
    }
    _getLabelBounds() {
      const t = this.getLabelTimestamps();
      let e = Number.POSITIVE_INFINITY,
        i = Number.NEGATIVE_INFINITY;
      return (
        t.length && ((e = t[0]), (i = t[t.length - 1])), { min: e, max: i }
      );
    }
    buildTicks() {
      const t = this.options,
        e = t.time,
        i = t.ticks,
        s =
          "labels" === i.source ? this.getLabelTimestamps() : this._generate();
      "ticks" === t.bounds &&
        s.length &&
        ((this.min = this._userMin || s[0]),
        (this.max = this._userMax || s[s.length - 1]));
      const n = this.min,
        o = nt(s, n, this.max);
      return (
        (this._unit =
          e.unit ||
          (i.autoSkip
            ? Vo(e.minUnit, this.min, this.max, this._getLabelCapacity(n))
            : (function (t, e, i, s, n) {
                for (let o = Io.length - 1; o >= Io.indexOf(i); o--) {
                  const i = Io[o];
                  if (Ro[i].common && t._adapter.diff(n, s, i) >= e - 1)
                    return i;
                }
                return Io[i ? Io.indexOf(i) : 0];
              })(this, o.length, e.minUnit, this.min, this.max))),
        (this._majorUnit =
          i.major.enabled && "year" !== this._unit
            ? (function (t) {
                for (let e = Io.indexOf(t) + 1, i = Io.length; e < i; ++e)
                  if (Ro[Io[e]].common) return Io[e];
              })(this._unit)
            : void 0),
        this.initOffsets(s),
        t.reverse && o.reverse(),
        Wo(this, o, this._majorUnit)
      );
    }
    afterAutoSkip() {
      this.options.offsetAfterAutoskip &&
        this.initOffsets(this.ticks.map((t) => +t.value));
    }
    initOffsets(t = []) {
      let e,
        i,
        s = 0,
        n = 0;
      this.options.offset &&
        t.length &&
        ((e = this.getDecimalForValue(t[0])),
        (s = 1 === t.length ? 1 - e : (this.getDecimalForValue(t[1]) - e) / 2),
        (i = this.getDecimalForValue(t[t.length - 1])),
        (n =
          1 === t.length
            ? i
            : (i - this.getDecimalForValue(t[t.length - 2])) / 2));
      const o = t.length < 3 ? 0.5 : 0.25;
      (s = J(s, 0, o)),
        (n = J(n, 0, o)),
        (this._offsets = { start: s, end: n, factor: 1 / (s + 1 + n) });
    }
    _generate() {
      const t = this._adapter,
        e = this.min,
        i = this.max,
        s = this.options,
        n = s.time,
        o = n.unit || Vo(n.minUnit, e, i, this._getLabelCapacity(e)),
        a = l(s.ticks.stepSize, 1),
        r = "week" === o && n.isoWeekday,
        h = N(r) || !0 === r,
        c = {};
      let d,
        u,
        f = e;
      if (
        (h && (f = +t.startOf(f, "isoWeek", r)),
        (f = +t.startOf(f, h ? "day" : o)),
        t.diff(i, e, o) > 1e5 * a)
      )
        throw new Error(
          e + " and " + i + " are too far apart with stepSize of " + a + " " + o
        );
      const g = "data" === s.ticks.source && this.getDataTimestamps();
      for (d = f, u = 0; d < i; d = +t.add(d, a, o), u++) Bo(c, d, g);
      return (
        (d !== i && "ticks" !== s.bounds && 1 !== u) || Bo(c, d, g),
        Object.keys(c)
          .sort(zo)
          .map((t) => +t)
      );
    }
    getLabelForValue(t) {
      const e = this._adapter,
        i = this.options.time;
      return i.tooltipFormat
        ? e.format(t, i.tooltipFormat)
        : e.format(t, i.displayFormats.datetime);
    }
    format(t, e) {
      const i = this.options.time.displayFormats,
        s = this._unit,
        n = e || i[s];
      return this._adapter.format(t, n);
    }
    _tickFormatFunction(t, e, i, s) {
      const n = this.options,
        o = n.ticks.callback;
      if (o) return d(o, [t, e, i], this);
      const a = n.time.displayFormats,
        r = this._unit,
        l = this._majorUnit,
        h = r && a[r],
        c = l && a[l],
        u = i[e],
        f = l && c && u && u.major;
      return this._adapter.format(t, s || (f ? c : h));
    }
    generateTickLabels(t) {
      let e, i, s;
      for (e = 0, i = t.length; e < i; ++e)
        (s = t[e]), (s.label = this._tickFormatFunction(s.value, e, t));
    }
    getDecimalForValue(t) {
      return null === t ? NaN : (t - this.min) / (this.max - this.min);
    }
    getPixelForValue(t) {
      const e = this._offsets,
        i = this.getDecimalForValue(t);
      return this.getPixelForDecimal((e.start + i) * e.factor);
    }
    getValueForPixel(t) {
      const e = this._offsets,
        i = this.getDecimalForPixel(t) / e.factor - e.end;
      return this.min + i * (this.max - this.min);
    }
    _getLabelSize(t) {
      const e = this.options.ticks,
        i = this.ctx.measureText(t).width,
        s = $(this.isHorizontal() ? e.maxRotation : e.minRotation),
        n = Math.cos(s),
        o = Math.sin(s),
        a = this._resolveTickFontOptions(0).size;
      return { w: i * n + a * o, h: i * o + a * n };
    }
    _getLabelCapacity(t) {
      const e = this.options.time,
        i = e.displayFormats,
        s = i[e.unit] || i.millisecond,
        n = this._tickFormatFunction(t, 0, Wo(this, [t], this._majorUnit), s),
        o = this._getLabelSize(n),
        a =
          Math.floor(
            this.isHorizontal() ? this.width / o.w : this.height / o.h
          ) - 1;
      return a > 0 ? a : 1;
    }
    getDataTimestamps() {
      let t,
        e,
        i = this._cache.data || [];
      if (i.length) return i;
      const s = this.getMatchingVisibleMetas();
      if (this._normalized && s.length)
        return (this._cache.data = s[0].controller.getAllParsedValues(this));
      for (t = 0, e = s.length; t < e; ++t)
        i = i.concat(s[t].controller.getAllParsedValues(this));
      return (this._cache.data = this.normalize(i));
    }
    getLabelTimestamps() {
      const t = this._cache.labels || [];
      let e, i;
      if (t.length) return t;
      const s = this.getLabels();
      for (e = 0, i = s.length; e < i; ++e) t.push(Fo(this, s[e]));
      return (this._cache.labels = this._normalized ? t : this.normalize(t));
    }
    normalize(t) {
      return lt(t.sort(zo));
    }
  }
  function Ho(t, e, i) {
    let s,
      n,
      o,
      a,
      r = 0,
      l = t.length - 1;
    i
      ? (e >= t[r].pos && e <= t[l].pos && ({ lo: r, hi: l } = it(t, "pos", e)),
        ({ pos: s, time: o } = t[r]),
        ({ pos: n, time: a } = t[l]))
      : (e >= t[r].time &&
          e <= t[l].time &&
          ({ lo: r, hi: l } = it(t, "time", e)),
        ({ time: s, pos: o } = t[r]),
        ({ time: n, pos: a } = t[l]));
    const h = n - s;
    return h ? o + ((a - o) * (e - s)) / h : o;
  }
  var jo = Object.freeze({
    __proto__: null,
    CategoryScale: class extends Js {
      static id = "category";
      static defaults = { ticks: { callback: po } };
      constructor(t) {
        super(t),
          (this._startValue = void 0),
          (this._valueRange = 0),
          (this._addedLabels = []);
      }
      init(t) {
        const e = this._addedLabels;
        if (e.length) {
          const t = this.getLabels();
          for (const { index: i, label: s } of e) t[i] === s && t.splice(i, 1);
          this._addedLabels = [];
        }
        super.init(t);
      }
      parse(t, e) {
        if (s(t)) return null;
        const i = this.getLabels();
        return ((t, e) => (null === t ? null : J(Math.round(t), 0, e)))(
          (e =
            isFinite(e) && i[e] === t
              ? e
              : go(i, t, l(e, t), this._addedLabels)),
          i.length - 1
        );
      }
      determineDataLimits() {
        const { minDefined: t, maxDefined: e } = this.getUserBounds();
        let { min: i, max: s } = this.getMinMax(!0);
        "ticks" === this.options.bounds &&
          (t || (i = 0), e || (s = this.getLabels().length - 1)),
          (this.min = i),
          (this.max = s);
      }
      buildTicks() {
        const t = this.min,
          e = this.max,
          i = this.options.offset,
          s = [];
        let n = this.getLabels();
        (n = 0 === t && e === n.length - 1 ? n : n.slice(t, e + 1)),
          (this._valueRange = Math.max(n.length - (i ? 0 : 1), 1)),
          (this._startValue = this.min - (i ? 0.5 : 0));
        for (let i = t; i <= e; i++) s.push({ value: i });
        return s;
      }
      getLabelForValue(t) {
        return po.call(this, t);
      }
      configure() {
        super.configure(),
          this.isHorizontal() || (this._reversePixels = !this._reversePixels);
      }
      getPixelForValue(t) {
        return (
          "number" != typeof t && (t = this.parse(t)),
          null === t
            ? NaN
            : this.getPixelForDecimal((t - this._startValue) / this._valueRange)
        );
      }
      getPixelForTick(t) {
        const e = this.ticks;
        return t < 0 || t > e.length - 1
          ? null
          : this.getPixelForValue(e[t].value);
      }
      getValueForPixel(t) {
        return Math.round(
          this._startValue + this.getDecimalForPixel(t) * this._valueRange
        );
      }
      getBasePixel() {
        return this.bottom;
      }
    },
    LinearScale: bo,
    LogarithmicScale: ko,
    RadialLinearScale: Eo,
    TimeScale: No,
    TimeSeriesScale: class extends No {
      static id = "timeseries";
      static defaults = No.defaults;
      constructor(t) {
        super(t),
          (this._table = []),
          (this._minPos = void 0),
          (this._tableRange = void 0);
      }
      initOffsets() {
        const t = this._getTimestampsForTable(),
          e = (this._table = this.buildLookupTable(t));
        (this._minPos = Ho(e, this.min)),
          (this._tableRange = Ho(e, this.max) - this._minPos),
          super.initOffsets(t);
      }
      buildLookupTable(t) {
        const { min: e, max: i } = this,
          s = [],
          n = [];
        let o, a, r, l, h;
        for (o = 0, a = t.length; o < a; ++o)
          (l = t[o]), l >= e && l <= i && s.push(l);
        if (s.length < 2)
          return [
            { time: e, pos: 0 },
            { time: i, pos: 1 },
          ];
        for (o = 0, a = s.length; o < a; ++o)
          (h = s[o + 1]),
            (r = s[o - 1]),
            (l = s[o]),
            Math.round((h + r) / 2) !== l &&
              n.push({ time: l, pos: o / (a - 1) });
        return n;
      }
      _generate() {
        const t = this.min,
          e = this.max;
        let i = super.getDataTimestamps();
        return (
          (i.includes(t) && i.length) || i.splice(0, 0, t),
          (i.includes(e) && 1 !== i.length) || i.push(e),
          i.sort((t, e) => t - e)
        );
      }
      _getTimestampsForTable() {
        let t = this._cache.all || [];
        if (t.length) return t;
        const e = this.getDataTimestamps(),
          i = this.getLabelTimestamps();
        return (
          (t =
            e.length && i.length
              ? this.normalize(e.concat(i))
              : e.length
              ? e
              : i),
          (t = this._cache.all = t),
          t
        );
      }
      getDecimalForValue(t) {
        return (Ho(this._table, t) - this._minPos) / this._tableRange;
      }
      getValueForPixel(t) {
        const e = this._offsets,
          i = this.getDecimalForPixel(t) / e.factor - e.end;
        return Ho(this._table, i * this._tableRange + this._minPos, !0);
      }
    },
  });
  const $o = [
      "rgb(54, 162, 235)",
      "rgb(255, 99, 132)",
      "rgb(255, 159, 64)",
      "rgb(255, 205, 86)",
      "rgb(75, 192, 192)",
      "rgb(153, 102, 255)",
      "rgb(201, 203, 207)",
    ],
    Yo = $o.map((t) => t.replace("rgb(", "rgba(").replace(")", ", 0.5)"));
  function Uo(t) {
    return $o[t % $o.length];
  }
  function Xo(t) {
    return Yo[t % Yo.length];
  }
  function qo(t) {
    let e = 0;
    return (i, s) => {
      const n = t.getDatasetMeta(s).controller;
      n instanceof jn
        ? (e = (function (t, e) {
            return (t.backgroundColor = t.data.map(() => Uo(e++))), e;
          })(i, e))
        : n instanceof $n
        ? (e = (function (t, e) {
            return (t.backgroundColor = t.data.map(() => Xo(e++))), e;
          })(i, e))
        : n &&
          (e = (function (t, e) {
            return (t.borderColor = Uo(e)), (t.backgroundColor = Xo(e)), ++e;
          })(i, e));
    };
  }
  function Ko(t) {
    let e;
    for (e in t) if (t[e].borderColor || t[e].backgroundColor) return !0;
    return !1;
  }
  var Go = {
    id: "colors",
    defaults: { enabled: !0, forceOverride: !1 },
    beforeLayout(t, e, i) {
      if (!i.enabled) return;
      const {
          data: { datasets: s },
          options: n,
        } = t.config,
        { elements: o } = n;
      if (
        !i.forceOverride &&
        (Ko(s) ||
          ((a = n) && (a.borderColor || a.backgroundColor)) ||
          (o && Ko(o)))
      )
        return;
      var a;
      const r = qo(t);
      s.forEach(r);
    },
  };
  function Zo(t) {
    if (t._decimated) {
      const e = t._data;
      delete t._decimated,
        delete t._data,
        Object.defineProperty(t, "data", {
          configurable: !0,
          enumerable: !0,
          writable: !0,
          value: e,
        });
    }
  }
  function Jo(t) {
    t.data.datasets.forEach((t) => {
      Zo(t);
    });
  }
  var Qo = {
    id: "decimation",
    defaults: { algorithm: "min-max", enabled: !1 },
    beforeElementsUpdate: (t, e, i) => {
      if (!i.enabled) return void Jo(t);
      const n = t.width;
      t.data.datasets.forEach((e, o) => {
        const { _data: a, indexAxis: r } = e,
          l = t.getDatasetMeta(o),
          h = a || e.data;
        if ("y" === Pi([r, t.options.indexAxis])) return;
        if (!l.controller.supportsDecimation) return;
        const c = t.scales[l.xAxisID];
        if ("linear" !== c.type && "time" !== c.type) return;
        if (t.options.parsing) return;
        let { start: d, count: u } = (function (t, e) {
          const i = e.length;
          let s,
            n = 0;
          const { iScale: o } = t,
            {
              min: a,
              max: r,
              minDefined: l,
              maxDefined: h,
            } = o.getUserBounds();
          return (
            l && (n = J(it(e, o.axis, a).lo, 0, i - 1)),
            (s = h ? J(it(e, o.axis, r).hi + 1, n, i) - n : i - n),
            { start: n, count: s }
          );
        })(l, h);
        if (u <= (i.threshold || 4 * n)) return void Zo(e);
        let f;
        switch (
          (s(a) &&
            ((e._data = h),
            delete e.data,
            Object.defineProperty(e, "data", {
              configurable: !0,
              enumerable: !0,
              get: function () {
                return this._decimated;
              },
              set: function (t) {
                this._data = t;
              },
            })),
          i.algorithm)
        ) {
          case "lttb":
            f = (function (t, e, i, s, n) {
              const o = n.samples || s;
              if (o >= i) return t.slice(e, e + i);
              const a = [],
                r = (i - 2) / (o - 2);
              let l = 0;
              const h = e + i - 1;
              let c,
                d,
                u,
                f,
                g,
                p = e;
              for (a[l++] = t[p], c = 0; c < o - 2; c++) {
                let s,
                  n = 0,
                  o = 0;
                const h = Math.floor((c + 1) * r) + 1 + e,
                  m = Math.min(Math.floor((c + 2) * r) + 1, i) + e,
                  x = m - h;
                for (s = h; s < m; s++) (n += t[s].x), (o += t[s].y);
                (n /= x), (o /= x);
                const b = Math.floor(c * r) + 1 + e,
                  _ = Math.min(Math.floor((c + 1) * r) + 1, i) + e,
                  { x: y, y: v } = t[p];
                for (u = f = -1, s = b; s < _; s++)
                  (f =
                    0.5 *
                    Math.abs((y - n) * (t[s].y - v) - (y - t[s].x) * (o - v))),
                    f > u && ((u = f), (d = t[s]), (g = s));
                (a[l++] = d), (p = g);
              }
              return (a[l++] = t[h]), a;
            })(h, d, u, n, i);
            break;
          case "min-max":
            f = (function (t, e, i, n) {
              let o,
                a,
                r,
                l,
                h,
                c,
                d,
                u,
                f,
                g,
                p = 0,
                m = 0;
              const x = [],
                b = e + i - 1,
                _ = t[e].x,
                y = t[b].x - _;
              for (o = e; o < e + i; ++o) {
                (a = t[o]), (r = ((a.x - _) / y) * n), (l = a.y);
                const e = 0 | r;
                if (e === h)
                  l < f ? ((f = l), (c = o)) : l > g && ((g = l), (d = o)),
                    (p = (m * p + a.x) / ++m);
                else {
                  const i = o - 1;
                  if (!s(c) && !s(d)) {
                    const e = Math.min(c, d),
                      s = Math.max(c, d);
                    e !== u && e !== i && x.push({ ...t[e], x: p }),
                      s !== u && s !== i && x.push({ ...t[s], x: p });
                  }
                  o > 0 && i !== u && x.push(t[i]),
                    x.push(a),
                    (h = e),
                    (m = 0),
                    (f = g = l),
                    (c = d = u = o);
                }
              }
              return x;
            })(h, d, u, n);
            break;
          default:
            throw new Error(
              `Unsupported decimation algorithm '${i.algorithm}'`
            );
        }
        e._decimated = f;
      });
    },
    destroy(t) {
      Jo(t);
    },
  };
  function ta(t, e, i, s) {
    if (s) return;
    let n = e[t],
      o = i[t];
    return (
      "angle" === t && ((n = G(n)), (o = G(o))),
      { property: t, start: n, end: o }
    );
  }
  function ea(t, e, i) {
    for (; e > t; e--) {
      const t = i[e];
      if (!isNaN(t.x) && !isNaN(t.y)) break;
    }
    return e;
  }
  function ia(t, e, i, s) {
    return t && e ? s(t[i], e[i]) : t ? t[i] : e ? e[i] : 0;
  }
  function sa(t, e) {
    let i = [],
      s = !1;
    return (
      n(t)
        ? ((s = !0), (i = t))
        : (i = (function (t, e) {
            const { x: i = null, y: s = null } = t || {},
              n = e.points,
              o = [];
            return (
              e.segments.forEach(({ start: t, end: e }) => {
                e = ea(t, e, n);
                const a = n[t],
                  r = n[e];
                null !== s
                  ? (o.push({ x: a.x, y: s }), o.push({ x: r.x, y: s }))
                  : null !== i &&
                    (o.push({ x: i, y: a.y }), o.push({ x: i, y: r.y }));
              }),
              o
            );
          })(t, e)),
      i.length
        ? new no({ points: i, options: { tension: 0 }, _loop: s, _fullLoop: s })
        : null
    );
  }
  function na(t) {
    return t && !1 !== t.fill;
  }
  function oa(t, e, i) {
    let s = t[e].fill;
    const n = [e];
    let o;
    if (!i) return s;
    for (; !1 !== s && -1 === n.indexOf(s); ) {
      if (!a(s)) return s;
      if (((o = t[s]), !o)) return !1;
      if (o.visible) return s;
      n.push(s), (s = o.fill);
    }
    return !1;
  }
  function aa(t, e, i) {
    const s = (function (t) {
      const e = t.options,
        i = e.fill;
      let s = l(i && i.target, i);
      void 0 === s && (s = !!e.backgroundColor);
      if (!1 === s || null === s) return !1;
      if (!0 === s) return "origin";
      return s;
    })(t);
    if (o(s)) return !isNaN(s.value) && s;
    let n = parseFloat(s);
    return a(n) && Math.floor(n) === n
      ? (function (t, e, i, s) {
          ("-" !== t && "+" !== t) || (i = e + i);
          if (i === e || i < 0 || i >= s) return !1;
          return i;
        })(s[0], e, n, i)
      : ["origin", "start", "end", "stack", "shape"].indexOf(s) >= 0 && s;
  }
  function ra(t, e, i) {
    const s = [];
    for (let n = 0; n < i.length; n++) {
      const o = i[n],
        { first: a, last: r, point: l } = la(o, e, "x");
      if (!(!l || (a && r)))
        if (a) s.unshift(l);
        else if ((t.push(l), !r)) break;
    }
    t.push(...s);
  }
  function la(t, e, i) {
    const s = t.interpolate(e, i);
    if (!s) return {};
    const n = s[i],
      o = t.segments,
      a = t.points;
    let r = !1,
      l = !1;
    for (let t = 0; t < o.length; t++) {
      const e = o[t],
        s = a[e.start][i],
        h = a[e.end][i];
      if (tt(n, s, h)) {
        (r = n === s), (l = n === h);
        break;
      }
    }
    return { first: r, last: l, point: s };
  }
  class ha {
    constructor(t) {
      (this.x = t.x), (this.y = t.y), (this.radius = t.radius);
    }
    pathSegment(t, e, i) {
      const { x: s, y: n, radius: o } = this;
      return (
        (e = e || { start: 0, end: O }),
        t.arc(s, n, o, e.end, e.start, !0),
        !i.bounds
      );
    }
    interpolate(t) {
      const { x: e, y: i, radius: s } = this,
        n = t.angle;
      return { x: e + Math.cos(n) * s, y: i + Math.sin(n) * s, angle: n };
    }
  }
  function ca(t) {
    const { chart: e, fill: i, line: s } = t;
    if (a(i))
      return (function (t, e) {
        const i = t.getDatasetMeta(e),
          s = i && t.isDatasetVisible(e);
        return s ? i.dataset : null;
      })(e, i);
    if ("stack" === i)
      return (function (t) {
        const { scale: e, index: i, line: s } = t,
          n = [],
          o = s.segments,
          a = s.points,
          r = (function (t, e) {
            const i = [],
              s = t.getMatchingVisibleMetas("line");
            for (let t = 0; t < s.length; t++) {
              const n = s[t];
              if (n.index === e) break;
              n.hidden || i.unshift(n.dataset);
            }
            return i;
          })(e, i);
        r.push(sa({ x: null, y: e.bottom }, s));
        for (let t = 0; t < o.length; t++) {
          const e = o[t];
          for (let t = e.start; t <= e.end; t++) ra(n, a[t], r);
        }
        return new no({ points: n, options: {} });
      })(t);
    if ("shape" === i) return !0;
    const n = (function (t) {
      const e = t.scale || {};
      if (e.getPointPositionForValue)
        return (function (t) {
          const { scale: e, fill: i } = t,
            s = e.options,
            n = e.getLabels().length,
            a = s.reverse ? e.max : e.min,
            r = (function (t, e, i) {
              let s;
              return (
                (s =
                  "start" === t
                    ? i
                    : "end" === t
                    ? e.options.reverse
                      ? e.min
                      : e.max
                    : o(t)
                    ? t.value
                    : e.getBaseValue()),
                s
              );
            })(i, e, a),
            l = [];
          if (s.grid.circular) {
            const t = e.getPointPositionForValue(0, a);
            return new ha({
              x: t.x,
              y: t.y,
              radius: e.getDistanceFromCenterForValue(r),
            });
          }
          for (let t = 0; t < n; ++t) l.push(e.getPointPositionForValue(t, r));
          return l;
        })(t);
      return (function (t) {
        const { scale: e = {}, fill: i } = t,
          s = (function (t, e) {
            let i = null;
            return (
              "start" === t
                ? (i = e.bottom)
                : "end" === t
                ? (i = e.top)
                : o(t)
                ? (i = e.getPixelForValue(t.value))
                : e.getBasePixel && (i = e.getBasePixel()),
              i
            );
          })(i, e);
        if (a(s)) {
          const t = e.isHorizontal();
          return { x: t ? s : null, y: t ? null : s };
        }
        return null;
      })(t);
    })(t);
    return n instanceof ha ? n : sa(n, s);
  }
  function da(t, e, i) {
    const s = ca(e),
      { line: n, scale: o, axis: a } = e,
      r = n.options,
      l = r.fill,
      h = r.backgroundColor,
      { above: c = h, below: d = h } = l || {};
    s &&
      n.points.length &&
      (Ie(t, i),
      (function (t, e) {
        const { line: i, target: s, above: n, below: o, area: a, scale: r } = e,
          l = i._loop ? "angle" : e.axis;
        t.save(),
          "x" === l &&
            o !== n &&
            (ua(t, s, a.top),
            fa(t, { line: i, target: s, color: n, scale: r, property: l }),
            t.restore(),
            t.save(),
            ua(t, s, a.bottom));
        fa(t, { line: i, target: s, color: o, scale: r, property: l }),
          t.restore();
      })(t, {
        line: n,
        target: s,
        above: c,
        below: d,
        area: i,
        scale: o,
        axis: a,
      }),
      ze(t));
  }
  function ua(t, e, i) {
    const { segments: s, points: n } = e;
    let o = !0,
      a = !1;
    t.beginPath();
    for (const r of s) {
      const { start: s, end: l } = r,
        h = n[s],
        c = n[ea(s, l, n)];
      o
        ? (t.moveTo(h.x, h.y), (o = !1))
        : (t.lineTo(h.x, i), t.lineTo(h.x, h.y)),
        (a = !!e.pathSegment(t, r, { move: a })),
        a ? t.closePath() : t.lineTo(c.x, i);
    }
    t.lineTo(e.first().x, i), t.closePath(), t.clip();
  }
  function fa(t, e) {
    const { line: i, target: s, property: n, color: o, scale: a } = e,
      r = (function (t, e, i) {
        const s = t.segments,
          n = t.points,
          o = e.points,
          a = [];
        for (const t of s) {
          let { start: s, end: r } = t;
          r = ea(s, r, n);
          const l = ta(i, n[s], n[r], t.loop);
          if (!e.segments) {
            a.push({ source: t, target: l, start: n[s], end: n[r] });
            continue;
          }
          const h = Ii(e, l);
          for (const e of h) {
            const s = ta(i, o[e.start], o[e.end], e.loop),
              r = Ri(t, n, s);
            for (const t of r)
              a.push({
                source: t,
                target: e,
                start: { [i]: ia(l, s, "start", Math.max) },
                end: { [i]: ia(l, s, "end", Math.min) },
              });
          }
        }
        return a;
      })(i, s, n);
    for (const { source: e, target: l, start: h, end: c } of r) {
      const { style: { backgroundColor: r = o } = {} } = e,
        d = !0 !== s;
      t.save(), (t.fillStyle = r), ga(t, a, d && ta(n, h, c)), t.beginPath();
      const u = !!i.pathSegment(t, e);
      let f;
      if (d) {
        u ? t.closePath() : pa(t, s, c, n);
        const e = !!s.pathSegment(t, l, { move: u, reverse: !0 });
        (f = u && e), f || pa(t, s, h, n);
      }
      t.closePath(), t.fill(f ? "evenodd" : "nonzero"), t.restore();
    }
  }
  function ga(t, e, i) {
    const { top: s, bottom: n } = e.chart.chartArea,
      { property: o, start: a, end: r } = i || {};
    "x" === o && (t.beginPath(), t.rect(a, s, r - a, n - s), t.clip());
  }
  function pa(t, e, i, s) {
    const n = e.interpolate(i, s);
    n && t.lineTo(n.x, n.y);
  }
  var ma = {
    id: "filler",
    afterDatasetsUpdate(t, e, i) {
      const s = (t.data.datasets || []).length,
        n = [];
      let o, a, r, l;
      for (a = 0; a < s; ++a)
        (o = t.getDatasetMeta(a)),
          (r = o.dataset),
          (l = null),
          r &&
            r.options &&
            r instanceof no &&
            (l = {
              visible: t.isDatasetVisible(a),
              index: a,
              fill: aa(r, a, s),
              chart: t,
              axis: o.controller.options.indexAxis,
              scale: o.vScale,
              line: r,
            }),
          (o.$filler = l),
          n.push(l);
      for (a = 0; a < s; ++a)
        (l = n[a]), l && !1 !== l.fill && (l.fill = oa(n, a, i.propagate));
    },
    beforeDraw(t, e, i) {
      const s = "beforeDraw" === i.drawTime,
        n = t.getSortedVisibleDatasetMetas(),
        o = t.chartArea;
      for (let e = n.length - 1; e >= 0; --e) {
        const i = n[e].$filler;
        i &&
          (i.line.updateControlPoints(o, i.axis),
          s && i.fill && da(t.ctx, i, o));
      }
    },
    beforeDatasetsDraw(t, e, i) {
      if ("beforeDatasetsDraw" !== i.drawTime) return;
      const s = t.getSortedVisibleDatasetMetas();
      for (let e = s.length - 1; e >= 0; --e) {
        const i = s[e].$filler;
        na(i) && da(t.ctx, i, t.chartArea);
      }
    },
    beforeDatasetDraw(t, e, i) {
      const s = e.meta.$filler;
      na(s) && "beforeDatasetDraw" === i.drawTime && da(t.ctx, s, t.chartArea);
    },
    defaults: { propagate: !0, drawTime: "beforeDatasetDraw" },
  };
  const xa = (t, e) => {
    let { boxHeight: i = e, boxWidth: s = e } = t;
    return (
      t.usePointStyle &&
        ((i = Math.min(i, e)), (s = t.pointStyleWidth || Math.min(s, e))),
      { boxWidth: s, boxHeight: i, itemHeight: Math.max(e, i) }
    );
  };
  class ba extends Hs {
    constructor(t) {
      super(),
        (this._added = !1),
        (this.legendHitBoxes = []),
        (this._hoveredItem = null),
        (this.doughnutMode = !1),
        (this.chart = t.chart),
        (this.options = t.options),
        (this.ctx = t.ctx),
        (this.legendItems = void 0),
        (this.columnSizes = void 0),
        (this.lineWidths = void 0),
        (this.maxHeight = void 0),
        (this.maxWidth = void 0),
        (this.top = void 0),
        (this.bottom = void 0),
        (this.left = void 0),
        (this.right = void 0),
        (this.height = void 0),
        (this.width = void 0),
        (this._margins = void 0),
        (this.position = void 0),
        (this.weight = void 0),
        (this.fullSize = void 0);
    }
    update(t, e, i) {
      (this.maxWidth = t),
        (this.maxHeight = e),
        (this._margins = i),
        this.setDimensions(),
        this.buildLabels(),
        this.fit();
    }
    setDimensions() {
      this.isHorizontal()
        ? ((this.width = this.maxWidth),
          (this.left = this._margins.left),
          (this.right = this.width))
        : ((this.height = this.maxHeight),
          (this.top = this._margins.top),
          (this.bottom = this.height));
    }
    buildLabels() {
      const t = this.options.labels || {};
      let e = d(t.generateLabels, [this.chart], this) || [];
      t.filter && (e = e.filter((e) => t.filter(e, this.chart.data))),
        t.sort && (e = e.sort((e, i) => t.sort(e, i, this.chart.data))),
        this.options.reverse && e.reverse(),
        (this.legendItems = e);
    }
    fit() {
      const { options: t, ctx: e } = this;
      if (!t.display) return void (this.width = this.height = 0);
      const i = t.labels,
        s = Si(i.font),
        n = s.size,
        o = this._computeTitleHeight(),
        { boxWidth: a, itemHeight: r } = xa(i, n);
      let l, h;
      (e.font = s.string),
        this.isHorizontal()
          ? ((l = this.maxWidth), (h = this._fitRows(o, n, a, r) + 10))
          : ((h = this.maxHeight), (l = this._fitCols(o, s, a, r) + 10)),
        (this.width = Math.min(l, t.maxWidth || this.maxWidth)),
        (this.height = Math.min(h, t.maxHeight || this.maxHeight));
    }
    _fitRows(t, e, i, s) {
      const {
          ctx: n,
          maxWidth: o,
          options: {
            labels: { padding: a },
          },
        } = this,
        r = (this.legendHitBoxes = []),
        l = (this.lineWidths = [0]),
        h = s + a;
      let c = t;
      (n.textAlign = "left"), (n.textBaseline = "middle");
      let d = -1,
        u = -h;
      return (
        this.legendItems.forEach((t, f) => {
          const g = i + e / 2 + n.measureText(t.text).width;
          (0 === f || l[l.length - 1] + g + 2 * a > o) &&
            ((c += h), (l[l.length - (f > 0 ? 0 : 1)] = 0), (u += h), d++),
            (r[f] = { left: 0, top: u, row: d, width: g, height: s }),
            (l[l.length - 1] += g + a);
        }),
        c
      );
    }
    _fitCols(t, e, i, s) {
      const {
          ctx: n,
          maxHeight: o,
          options: {
            labels: { padding: a },
          },
        } = this,
        r = (this.legendHitBoxes = []),
        l = (this.columnSizes = []),
        h = o - t;
      let c = a,
        d = 0,
        u = 0,
        f = 0,
        g = 0;
      return (
        this.legendItems.forEach((t, o) => {
          const { itemWidth: p, itemHeight: m } = (function (t, e, i, s, n) {
            const o = (function (t, e, i, s) {
                let n = t.text;
                n &&
                  "string" != typeof n &&
                  (n = n.reduce((t, e) => (t.length > e.length ? t : e)));
                return e + i.size / 2 + s.measureText(n).width;
              })(s, t, e, i),
              a = (function (t, e, i) {
                let s = t;
                "string" != typeof e.text && (s = _a(e, i));
                return s;
              })(n, s, e.lineHeight);
            return { itemWidth: o, itemHeight: a };
          })(i, e, n, t, s);
          o > 0 &&
            u + m + 2 * a > h &&
            ((c += d + a),
            l.push({ width: d, height: u }),
            (f += d + a),
            g++,
            (d = u = 0)),
            (r[o] = { left: f, top: u, col: g, width: p, height: m }),
            (d = Math.max(d, p)),
            (u += m + a);
        }),
        (c += d),
        l.push({ width: d, height: u }),
        c
      );
    }
    adjustHitBoxes() {
      if (!this.options.display) return;
      const t = this._computeTitleHeight(),
        {
          legendHitBoxes: e,
          options: {
            align: i,
            labels: { padding: s },
            rtl: n,
          },
        } = this,
        o = Oi(n, this.left, this.width);
      if (this.isHorizontal()) {
        let n = 0,
          a = ft(i, this.left + s, this.right - this.lineWidths[n]);
        for (const r of e)
          n !== r.row &&
            ((n = r.row),
            (a = ft(i, this.left + s, this.right - this.lineWidths[n]))),
            (r.top += this.top + t + s),
            (r.left = o.leftForLtr(o.x(a), r.width)),
            (a += r.width + s);
      } else {
        let n = 0,
          a = ft(i, this.top + t + s, this.bottom - this.columnSizes[n].height);
        for (const r of e)
          r.col !== n &&
            ((n = r.col),
            (a = ft(
              i,
              this.top + t + s,
              this.bottom - this.columnSizes[n].height
            ))),
            (r.top = a),
            (r.left += this.left + s),
            (r.left = o.leftForLtr(o.x(r.left), r.width)),
            (a += r.height + s);
      }
    }
    isHorizontal() {
      return (
        "top" === this.options.position || "bottom" === this.options.position
      );
    }
    draw() {
      if (this.options.display) {
        const t = this.ctx;
        Ie(t, this), this._draw(), ze(t);
      }
    }
    _draw() {
      const { options: t, columnSizes: e, lineWidths: i, ctx: s } = this,
        { align: n, labels: o } = t,
        a = ue.color,
        r = Oi(t.rtl, this.left, this.width),
        h = Si(o.font),
        { padding: c } = o,
        d = h.size,
        u = d / 2;
      let f;
      this.drawTitle(),
        (s.textAlign = r.textAlign("left")),
        (s.textBaseline = "middle"),
        (s.lineWidth = 0.5),
        (s.font = h.string);
      const { boxWidth: g, boxHeight: p, itemHeight: m } = xa(o, d),
        x = this.isHorizontal(),
        b = this._computeTitleHeight();
      (f = x
        ? {
            x: ft(n, this.left + c, this.right - i[0]),
            y: this.top + c + b,
            line: 0,
          }
        : {
            x: this.left + c,
            y: ft(n, this.top + b + c, this.bottom - e[0].height),
            line: 0,
          }),
        Ai(this.ctx, t.textDirection);
      const _ = m + c;
      this.legendItems.forEach((y, v) => {
        (s.strokeStyle = y.fontColor), (s.fillStyle = y.fontColor);
        const M = s.measureText(y.text).width,
          w = r.textAlign(y.textAlign || (y.textAlign = o.textAlign)),
          k = g + u + M;
        let S = f.x,
          P = f.y;
        r.setWidth(this.width),
          x
            ? v > 0 &&
              S + k + c > this.right &&
              ((P = f.y += _),
              f.line++,
              (S = f.x = ft(n, this.left + c, this.right - i[f.line])))
            : v > 0 &&
              P + _ > this.bottom &&
              ((S = f.x = S + e[f.line].width + c),
              f.line++,
              (P = f.y =
                ft(n, this.top + b + c, this.bottom - e[f.line].height)));
        if (
          ((function (t, e, i) {
            if (isNaN(g) || g <= 0 || isNaN(p) || p < 0) return;
            s.save();
            const n = l(i.lineWidth, 1);
            if (
              ((s.fillStyle = l(i.fillStyle, a)),
              (s.lineCap = l(i.lineCap, "butt")),
              (s.lineDashOffset = l(i.lineDashOffset, 0)),
              (s.lineJoin = l(i.lineJoin, "miter")),
              (s.lineWidth = n),
              (s.strokeStyle = l(i.strokeStyle, a)),
              s.setLineDash(l(i.lineDash, [])),
              o.usePointStyle)
            ) {
              const a = {
                  radius: (p * Math.SQRT2) / 2,
                  pointStyle: i.pointStyle,
                  rotation: i.rotation,
                  borderWidth: n,
                },
                l = r.xPlus(t, g / 2);
              Ee(s, a, l, e + u, o.pointStyleWidth && g);
            } else {
              const o = e + Math.max((d - p) / 2, 0),
                a = r.leftForLtr(t, g),
                l = wi(i.borderRadius);
              s.beginPath(),
                Object.values(l).some((t) => 0 !== t)
                  ? He(s, { x: a, y: o, w: g, h: p, radius: l })
                  : s.rect(a, o, g, p),
                s.fill(),
                0 !== n && s.stroke();
            }
            s.restore();
          })(r.x(S), P, y),
          (S = gt(w, S + g + u, x ? S + k : this.right, t.rtl)),
          (function (t, e, i) {
            Ne(s, i.text, t, e + m / 2, h, {
              strikethrough: i.hidden,
              textAlign: r.textAlign(i.textAlign),
            });
          })(r.x(S), P, y),
          x)
        )
          f.x += k + c;
        else if ("string" != typeof y.text) {
          const t = h.lineHeight;
          f.y += _a(y, t) + c;
        } else f.y += _;
      }),
        Ti(this.ctx, t.textDirection);
    }
    drawTitle() {
      const t = this.options,
        e = t.title,
        i = Si(e.font),
        s = ki(e.padding);
      if (!e.display) return;
      const n = Oi(t.rtl, this.left, this.width),
        o = this.ctx,
        a = e.position,
        r = i.size / 2,
        l = s.top + r;
      let h,
        c = this.left,
        d = this.width;
      if (this.isHorizontal())
        (d = Math.max(...this.lineWidths)),
          (h = this.top + l),
          (c = ft(t.align, c, this.right - d));
      else {
        const e = this.columnSizes.reduce((t, e) => Math.max(t, e.height), 0);
        h =
          l +
          ft(
            t.align,
            this.top,
            this.bottom - e - t.labels.padding - this._computeTitleHeight()
          );
      }
      const u = ft(a, c, c + d);
      (o.textAlign = n.textAlign(ut(a))),
        (o.textBaseline = "middle"),
        (o.strokeStyle = e.color),
        (o.fillStyle = e.color),
        (o.font = i.string),
        Ne(o, e.text, u, h, i);
    }
    _computeTitleHeight() {
      const t = this.options.title,
        e = Si(t.font),
        i = ki(t.padding);
      return t.display ? e.lineHeight + i.height : 0;
    }
    _getLegendItemAt(t, e) {
      let i, s, n;
      if (tt(t, this.left, this.right) && tt(e, this.top, this.bottom))
        for (n = this.legendHitBoxes, i = 0; i < n.length; ++i)
          if (
            ((s = n[i]),
            tt(t, s.left, s.left + s.width) && tt(e, s.top, s.top + s.height))
          )
            return this.legendItems[i];
      return null;
    }
    handleEvent(t) {
      const e = this.options;
      if (
        !(function (t, e) {
          if (
            ("mousemove" === t || "mouseout" === t) &&
            (e.onHover || e.onLeave)
          )
            return !0;
          if (e.onClick && ("click" === t || "mouseup" === t)) return !0;
          return !1;
        })(t.type, e)
      )
        return;
      const i = this._getLegendItemAt(t.x, t.y);
      if ("mousemove" === t.type || "mouseout" === t.type) {
        const o = this._hoveredItem,
          a =
            ((n = i),
            null !== (s = o) &&
              null !== n &&
              s.datasetIndex === n.datasetIndex &&
              s.index === n.index);
        o && !a && d(e.onLeave, [t, o, this], this),
          (this._hoveredItem = i),
          i && !a && d(e.onHover, [t, i, this], this);
      } else i && d(e.onClick, [t, i, this], this);
      var s, n;
    }
  }
  function _a(t, e) {
    return e * (t.text ? t.text.length : 0);
  }
  var ya = {
    id: "legend",
    _element: ba,
    start(t, e, i) {
      const s = (t.legend = new ba({ ctx: t.ctx, options: i, chart: t }));
      as.configure(t, s, i), as.addBox(t, s);
    },
    stop(t) {
      as.removeBox(t, t.legend), delete t.legend;
    },
    beforeUpdate(t, e, i) {
      const s = t.legend;
      as.configure(t, s, i), (s.options = i);
    },
    afterUpdate(t) {
      const e = t.legend;
      e.buildLabels(), e.adjustHitBoxes();
    },
    afterEvent(t, e) {
      e.replay || t.legend.handleEvent(e.event);
    },
    defaults: {
      display: !0,
      position: "top",
      align: "center",
      fullSize: !0,
      reverse: !1,
      weight: 1e3,
      onClick(t, e, i) {
        const s = e.datasetIndex,
          n = i.chart;
        n.isDatasetVisible(s)
          ? (n.hide(s), (e.hidden = !0))
          : (n.show(s), (e.hidden = !1));
      },
      onHover: null,
      onLeave: null,
      labels: {
        color: (t) => t.chart.options.color,
        boxWidth: 40,
        padding: 10,
        generateLabels(t) {
          const e = t.data.datasets,
            {
              labels: {
                usePointStyle: i,
                pointStyle: s,
                textAlign: n,
                color: o,
                useBorderRadius: a,
                borderRadius: r,
              },
            } = t.legend.options;
          return t._getSortedDatasetMetas().map((t) => {
            const l = t.controller.getStyle(i ? 0 : void 0),
              h = ki(l.borderWidth);
            return {
              text: e[t.index].label,
              fillStyle: l.backgroundColor,
              fontColor: o,
              hidden: !t.visible,
              lineCap: l.borderCapStyle,
              lineDash: l.borderDash,
              lineDashOffset: l.borderDashOffset,
              lineJoin: l.borderJoinStyle,
              lineWidth: (h.width + h.height) / 4,
              strokeStyle: l.borderColor,
              pointStyle: s || l.pointStyle,
              rotation: l.rotation,
              textAlign: n || l.textAlign,
              borderRadius: a && (r || l.borderRadius),
              datasetIndex: t.index,
            };
          }, this);
        },
      },
      title: {
        color: (t) => t.chart.options.color,
        display: !1,
        position: "center",
        text: "",
      },
    },
    descriptors: {
      _scriptable: (t) => !t.startsWith("on"),
      labels: {
        _scriptable: (t) => !["generateLabels", "filter", "sort"].includes(t),
      },
    },
  };
  class va extends Hs {
    constructor(t) {
      super(),
        (this.chart = t.chart),
        (this.options = t.options),
        (this.ctx = t.ctx),
        (this._padding = void 0),
        (this.top = void 0),
        (this.bottom = void 0),
        (this.left = void 0),
        (this.right = void 0),
        (this.width = void 0),
        (this.height = void 0),
        (this.position = void 0),
        (this.weight = void 0),
        (this.fullSize = void 0);
    }
    update(t, e) {
      const i = this.options;
      if (((this.left = 0), (this.top = 0), !i.display))
        return void (this.width = this.height = this.right = this.bottom = 0);
      (this.width = this.right = t), (this.height = this.bottom = e);
      const s = n(i.text) ? i.text.length : 1;
      this._padding = ki(i.padding);
      const o = s * Si(i.font).lineHeight + this._padding.height;
      this.isHorizontal() ? (this.height = o) : (this.width = o);
    }
    isHorizontal() {
      const t = this.options.position;
      return "top" === t || "bottom" === t;
    }
    _drawArgs(t) {
      const { top: e, left: i, bottom: s, right: n, options: o } = this,
        a = o.align;
      let r,
        l,
        h,
        c = 0;
      return (
        this.isHorizontal()
          ? ((l = ft(a, i, n)), (h = e + t), (r = n - i))
          : ("left" === o.position
              ? ((l = i + t), (h = ft(a, s, e)), (c = -0.5 * C))
              : ((l = n - t), (h = ft(a, e, s)), (c = 0.5 * C)),
            (r = s - e)),
        { titleX: l, titleY: h, maxWidth: r, rotation: c }
      );
    }
    draw() {
      const t = this.ctx,
        e = this.options;
      if (!e.display) return;
      const i = Si(e.font),
        s = i.lineHeight / 2 + this._padding.top,
        { titleX: n, titleY: o, maxWidth: a, rotation: r } = this._drawArgs(s);
      Ne(t, e.text, 0, 0, i, {
        color: e.color,
        maxWidth: a,
        rotation: r,
        textAlign: ut(e.align),
        textBaseline: "middle",
        translation: [n, o],
      });
    }
  }
  var Ma = {
    id: "title",
    _element: va,
    start(t, e, i) {
      !(function (t, e) {
        const i = new va({ ctx: t.ctx, options: e, chart: t });
        as.configure(t, i, e), as.addBox(t, i), (t.titleBlock = i);
      })(t, i);
    },
    stop(t) {
      const e = t.titleBlock;
      as.removeBox(t, e), delete t.titleBlock;
    },
    beforeUpdate(t, e, i) {
      const s = t.titleBlock;
      as.configure(t, s, i), (s.options = i);
    },
    defaults: {
      align: "center",
      display: !1,
      font: { weight: "bold" },
      fullSize: !0,
      padding: 10,
      position: "top",
      text: "",
      weight: 2e3,
    },
    defaultRoutes: { color: "color" },
    descriptors: { _scriptable: !0, _indexable: !1 },
  };
  const wa = new WeakMap();
  var ka = {
    id: "subtitle",
    start(t, e, i) {
      const s = new va({ ctx: t.ctx, options: i, chart: t });
      as.configure(t, s, i), as.addBox(t, s), wa.set(t, s);
    },
    stop(t) {
      as.removeBox(t, wa.get(t)), wa.delete(t);
    },
    beforeUpdate(t, e, i) {
      const s = wa.get(t);
      as.configure(t, s, i), (s.options = i);
    },
    defaults: {
      align: "center",
      display: !1,
      font: { weight: "normal" },
      fullSize: !0,
      padding: 0,
      position: "top",
      text: "",
      weight: 1500,
    },
    defaultRoutes: { color: "color" },
    descriptors: { _scriptable: !0, _indexable: !1 },
  };
  const Sa = {
    average(t) {
      if (!t.length) return !1;
      let e,
        i,
        s = new Set(),
        n = 0,
        o = 0;
      for (e = 0, i = t.length; e < i; ++e) {
        const i = t[e].element;
        if (i && i.hasValue()) {
          const t = i.tooltipPosition();
          s.add(t.x), (n += t.y), ++o;
        }
      }
      if (0 === o || 0 === s.size) return !1;
      return { x: [...s].reduce((t, e) => t + e) / s.size, y: n / o };
    },
    nearest(t, e) {
      if (!t.length) return !1;
      let i,
        s,
        n,
        o = e.x,
        a = e.y,
        r = Number.POSITIVE_INFINITY;
      for (i = 0, s = t.length; i < s; ++i) {
        const s = t[i].element;
        if (s && s.hasValue()) {
          const t = q(e, s.getCenterPoint());
          t < r && ((r = t), (n = s));
        }
      }
      if (n) {
        const t = n.tooltipPosition();
        (o = t.x), (a = t.y);
      }
      return { x: o, y: a };
    },
  };
  function Pa(t, e) {
    return e && (n(e) ? Array.prototype.push.apply(t, e) : t.push(e)), t;
  }
  function Da(t) {
    return ("string" == typeof t || t instanceof String) && t.indexOf("\n") > -1
      ? t.split("\n")
      : t;
  }
  function Ca(t, e) {
    const { element: i, datasetIndex: s, index: n } = e,
      o = t.getDatasetMeta(s).controller,
      { label: a, value: r } = o.getLabelAndValue(n);
    return {
      chart: t,
      label: a,
      parsed: o.getParsed(n),
      raw: t.data.datasets[s].data[n],
      formattedValue: r,
      dataset: o.getDataset(),
      dataIndex: n,
      datasetIndex: s,
      element: i,
    };
  }
  function Oa(t, e) {
    const i = t.chart.ctx,
      { body: s, footer: n, title: o } = t,
      { boxWidth: a, boxHeight: r } = e,
      l = Si(e.bodyFont),
      h = Si(e.titleFont),
      c = Si(e.footerFont),
      d = o.length,
      f = n.length,
      g = s.length,
      p = ki(e.padding);
    let m = p.height,
      x = 0,
      b = s.reduce(
        (t, e) => t + e.before.length + e.lines.length + e.after.length,
        0
      );
    if (
      ((b += t.beforeBody.length + t.afterBody.length),
      d &&
        (m +=
          d * h.lineHeight + (d - 1) * e.titleSpacing + e.titleMarginBottom),
      b)
    ) {
      m +=
        g * (e.displayColors ? Math.max(r, l.lineHeight) : l.lineHeight) +
        (b - g) * l.lineHeight +
        (b - 1) * e.bodySpacing;
    }
    f &&
      (m += e.footerMarginTop + f * c.lineHeight + (f - 1) * e.footerSpacing);
    let _ = 0;
    const y = function (t) {
      x = Math.max(x, i.measureText(t).width + _);
    };
    return (
      i.save(),
      (i.font = h.string),
      u(t.title, y),
      (i.font = l.string),
      u(t.beforeBody.concat(t.afterBody), y),
      (_ = e.displayColors ? a + 2 + e.boxPadding : 0),
      u(s, (t) => {
        u(t.before, y), u(t.lines, y), u(t.after, y);
      }),
      (_ = 0),
      (i.font = c.string),
      u(t.footer, y),
      i.restore(),
      (x += p.width),
      { width: x, height: m }
    );
  }
  function Aa(t, e, i, s) {
    const { x: n, width: o } = i,
      {
        width: a,
        chartArea: { left: r, right: l },
      } = t;
    let h = "center";
    return (
      "center" === s
        ? (h = n <= (r + l) / 2 ? "left" : "right")
        : n <= o / 2
        ? (h = "left")
        : n >= a - o / 2 && (h = "right"),
      (function (t, e, i, s) {
        const { x: n, width: o } = s,
          a = i.caretSize + i.caretPadding;
        return (
          ("left" === t && n + o + a > e.width) ||
          ("right" === t && n - o - a < 0) ||
          void 0
        );
      })(h, t, e, i) && (h = "center"),
      h
    );
  }
  function Ta(t, e, i) {
    const s =
      i.yAlign ||
      e.yAlign ||
      (function (t, e) {
        const { y: i, height: s } = e;
        return i < s / 2 ? "top" : i > t.height - s / 2 ? "bottom" : "center";
      })(t, i);
    return { xAlign: i.xAlign || e.xAlign || Aa(t, e, i, s), yAlign: s };
  }
  function La(t, e, i, s) {
    const { caretSize: n, caretPadding: o, cornerRadius: a } = t,
      { xAlign: r, yAlign: l } = i,
      h = n + o,
      { topLeft: c, topRight: d, bottomLeft: u, bottomRight: f } = wi(a);
    let g = (function (t, e) {
      let { x: i, width: s } = t;
      return "right" === e ? (i -= s) : "center" === e && (i -= s / 2), i;
    })(e, r);
    const p = (function (t, e, i) {
      let { y: s, height: n } = t;
      return "top" === e ? (s += i) : (s -= "bottom" === e ? n + i : n / 2), s;
    })(e, l, h);
    return (
      "center" === l
        ? "left" === r
          ? (g += h)
          : "right" === r && (g -= h)
        : "left" === r
        ? (g -= Math.max(c, u) + n)
        : "right" === r && (g += Math.max(d, f) + n),
      { x: J(g, 0, s.width - e.width), y: J(p, 0, s.height - e.height) }
    );
  }
  function Ea(t, e, i) {
    const s = ki(i.padding);
    return "center" === e
      ? t.x + t.width / 2
      : "right" === e
      ? t.x + t.width - s.right
      : t.x + s.left;
  }
  function Ra(t) {
    return Pa([], Da(t));
  }
  function Ia(t, e) {
    const i =
      e && e.dataset && e.dataset.tooltip && e.dataset.tooltip.callbacks;
    return i ? t.override(i) : t;
  }
  const za = {
    beforeTitle: e,
    title(t) {
      if (t.length > 0) {
        const e = t[0],
          i = e.chart.data.labels,
          s = i ? i.length : 0;
        if (this && this.options && "dataset" === this.options.mode)
          return e.dataset.label || "";
        if (e.label) return e.label;
        if (s > 0 && e.dataIndex < s) return i[e.dataIndex];
      }
      return "";
    },
    afterTitle: e,
    beforeBody: e,
    beforeLabel: e,
    label(t) {
      if (this && this.options && "dataset" === this.options.mode)
        return t.label + ": " + t.formattedValue || t.formattedValue;
      let e = t.dataset.label || "";
      e && (e += ": ");
      const i = t.formattedValue;
      return s(i) || (e += i), e;
    },
    labelColor(t) {
      const e = t.chart
        .getDatasetMeta(t.datasetIndex)
        .controller.getStyle(t.dataIndex);
      return {
        borderColor: e.borderColor,
        backgroundColor: e.backgroundColor,
        borderWidth: e.borderWidth,
        borderDash: e.borderDash,
        borderDashOffset: e.borderDashOffset,
        borderRadius: 0,
      };
    },
    labelTextColor() {
      return this.options.bodyColor;
    },
    labelPointStyle(t) {
      const e = t.chart
        .getDatasetMeta(t.datasetIndex)
        .controller.getStyle(t.dataIndex);
      return { pointStyle: e.pointStyle, rotation: e.rotation };
    },
    afterLabel: e,
    afterBody: e,
    beforeFooter: e,
    footer: e,
    afterFooter: e,
  };
  function Fa(t, e, i, s) {
    const n = t[e].call(i, s);
    return void 0 === n ? za[e].call(i, s) : n;
  }
  class Va extends Hs {
    static positioners = Sa;
    constructor(t) {
      super(),
        (this.opacity = 0),
        (this._active = []),
        (this._eventPosition = void 0),
        (this._size = void 0),
        (this._cachedAnimations = void 0),
        (this._tooltipItems = []),
        (this.$animations = void 0),
        (this.$context = void 0),
        (this.chart = t.chart),
        (this.options = t.options),
        (this.dataPoints = void 0),
        (this.title = void 0),
        (this.beforeBody = void 0),
        (this.body = void 0),
        (this.afterBody = void 0),
        (this.footer = void 0),
        (this.xAlign = void 0),
        (this.yAlign = void 0),
        (this.x = void 0),
        (this.y = void 0),
        (this.height = void 0),
        (this.width = void 0),
        (this.caretX = void 0),
        (this.caretY = void 0),
        (this.labelColors = void 0),
        (this.labelPointStyles = void 0),
        (this.labelTextColors = void 0);
    }
    initialize(t) {
      (this.options = t),
        (this._cachedAnimations = void 0),
        (this.$context = void 0);
    }
    _resolveAnimations() {
      const t = this._cachedAnimations;
      if (t) return t;
      const e = this.chart,
        i = this.options.setContext(this.getContext()),
        s = i.enabled && e.options.animation && i.animations,
        n = new Os(this.chart, s);
      return s._cacheable && (this._cachedAnimations = Object.freeze(n)), n;
    }
    getContext() {
      return (
        this.$context ||
        (this.$context =
          ((t = this.chart.getContext()),
          (e = this),
          (i = this._tooltipItems),
          Ci(t, { tooltip: e, tooltipItems: i, type: "tooltip" })))
      );
      var t, e, i;
    }
    getTitle(t, e) {
      const { callbacks: i } = e,
        s = Fa(i, "beforeTitle", this, t),
        n = Fa(i, "title", this, t),
        o = Fa(i, "afterTitle", this, t);
      let a = [];
      return (a = Pa(a, Da(s))), (a = Pa(a, Da(n))), (a = Pa(a, Da(o))), a;
    }
    getBeforeBody(t, e) {
      return Ra(Fa(e.callbacks, "beforeBody", this, t));
    }
    getBody(t, e) {
      const { callbacks: i } = e,
        s = [];
      return (
        u(t, (t) => {
          const e = { before: [], lines: [], after: [] },
            n = Ia(i, t);
          Pa(e.before, Da(Fa(n, "beforeLabel", this, t))),
            Pa(e.lines, Fa(n, "label", this, t)),
            Pa(e.after, Da(Fa(n, "afterLabel", this, t))),
            s.push(e);
        }),
        s
      );
    }
    getAfterBody(t, e) {
      return Ra(Fa(e.callbacks, "afterBody", this, t));
    }
    getFooter(t, e) {
      const { callbacks: i } = e,
        s = Fa(i, "beforeFooter", this, t),
        n = Fa(i, "footer", this, t),
        o = Fa(i, "afterFooter", this, t);
      let a = [];
      return (a = Pa(a, Da(s))), (a = Pa(a, Da(n))), (a = Pa(a, Da(o))), a;
    }
    _createItems(t) {
      const e = this._active,
        i = this.chart.data,
        s = [],
        n = [],
        o = [];
      let a,
        r,
        l = [];
      for (a = 0, r = e.length; a < r; ++a) l.push(Ca(this.chart, e[a]));
      return (
        t.filter && (l = l.filter((e, s, n) => t.filter(e, s, n, i))),
        t.itemSort && (l = l.sort((e, s) => t.itemSort(e, s, i))),
        u(l, (e) => {
          const i = Ia(t.callbacks, e);
          s.push(Fa(i, "labelColor", this, e)),
            n.push(Fa(i, "labelPointStyle", this, e)),
            o.push(Fa(i, "labelTextColor", this, e));
        }),
        (this.labelColors = s),
        (this.labelPointStyles = n),
        (this.labelTextColors = o),
        (this.dataPoints = l),
        l
      );
    }
    update(t, e) {
      const i = this.options.setContext(this.getContext()),
        s = this._active;
      let n,
        o = [];
      if (s.length) {
        const t = Sa[i.position].call(this, s, this._eventPosition);
        (o = this._createItems(i)),
          (this.title = this.getTitle(o, i)),
          (this.beforeBody = this.getBeforeBody(o, i)),
          (this.body = this.getBody(o, i)),
          (this.afterBody = this.getAfterBody(o, i)),
          (this.footer = this.getFooter(o, i));
        const e = (this._size = Oa(this, i)),
          a = Object.assign({}, t, e),
          r = Ta(this.chart, i, a),
          l = La(i, a, r, this.chart);
        (this.xAlign = r.xAlign),
          (this.yAlign = r.yAlign),
          (n = {
            opacity: 1,
            x: l.x,
            y: l.y,
            width: e.width,
            height: e.height,
            caretX: t.x,
            caretY: t.y,
          });
      } else 0 !== this.opacity && (n = { opacity: 0 });
      (this._tooltipItems = o),
        (this.$context = void 0),
        n && this._resolveAnimations().update(this, n),
        t &&
          i.external &&
          i.external.call(this, {
            chart: this.chart,
            tooltip: this,
            replay: e,
          });
    }
    drawCaret(t, e, i, s) {
      const n = this.getCaretPosition(t, i, s);
      e.lineTo(n.x1, n.y1), e.lineTo(n.x2, n.y2), e.lineTo(n.x3, n.y3);
    }
    getCaretPosition(t, e, i) {
      const { xAlign: s, yAlign: n } = this,
        { caretSize: o, cornerRadius: a } = i,
        { topLeft: r, topRight: l, bottomLeft: h, bottomRight: c } = wi(a),
        { x: d, y: u } = t,
        { width: f, height: g } = e;
      let p, m, x, b, _, y;
      return (
        "center" === n
          ? ((_ = u + g / 2),
            "left" === s
              ? ((p = d), (m = p - o), (b = _ + o), (y = _ - o))
              : ((p = d + f), (m = p + o), (b = _ - o), (y = _ + o)),
            (x = p))
          : ((m =
              "left" === s
                ? d + Math.max(r, h) + o
                : "right" === s
                ? d + f - Math.max(l, c) - o
                : this.caretX),
            "top" === n
              ? ((b = u), (_ = b - o), (p = m - o), (x = m + o))
              : ((b = u + g), (_ = b + o), (p = m + o), (x = m - o)),
            (y = b)),
        { x1: p, x2: m, x3: x, y1: b, y2: _, y3: y }
      );
    }
    drawTitle(t, e, i) {
      const s = this.title,
        n = s.length;
      let o, a, r;
      if (n) {
        const l = Oi(i.rtl, this.x, this.width);
        for (
          t.x = Ea(this, i.titleAlign, i),
            e.textAlign = l.textAlign(i.titleAlign),
            e.textBaseline = "middle",
            o = Si(i.titleFont),
            a = i.titleSpacing,
            e.fillStyle = i.titleColor,
            e.font = o.string,
            r = 0;
          r < n;
          ++r
        )
          e.fillText(s[r], l.x(t.x), t.y + o.lineHeight / 2),
            (t.y += o.lineHeight + a),
            r + 1 === n && (t.y += i.titleMarginBottom - a);
      }
    }
    _drawColorBox(t, e, i, s, n) {
      const a = this.labelColors[i],
        r = this.labelPointStyles[i],
        { boxHeight: l, boxWidth: h } = n,
        c = Si(n.bodyFont),
        d = Ea(this, "left", n),
        u = s.x(d),
        f = l < c.lineHeight ? (c.lineHeight - l) / 2 : 0,
        g = e.y + f;
      if (n.usePointStyle) {
        const e = {
            radius: Math.min(h, l) / 2,
            pointStyle: r.pointStyle,
            rotation: r.rotation,
            borderWidth: 1,
          },
          i = s.leftForLtr(u, h) + h / 2,
          o = g + l / 2;
        (t.strokeStyle = n.multiKeyBackground),
          (t.fillStyle = n.multiKeyBackground),
          Le(t, e, i, o),
          (t.strokeStyle = a.borderColor),
          (t.fillStyle = a.backgroundColor),
          Le(t, e, i, o);
      } else {
        (t.lineWidth = o(a.borderWidth)
          ? Math.max(...Object.values(a.borderWidth))
          : a.borderWidth || 1),
          (t.strokeStyle = a.borderColor),
          t.setLineDash(a.borderDash || []),
          (t.lineDashOffset = a.borderDashOffset || 0);
        const e = s.leftForLtr(u, h),
          i = s.leftForLtr(s.xPlus(u, 1), h - 2),
          r = wi(a.borderRadius);
        Object.values(r).some((t) => 0 !== t)
          ? (t.beginPath(),
            (t.fillStyle = n.multiKeyBackground),
            He(t, { x: e, y: g, w: h, h: l, radius: r }),
            t.fill(),
            t.stroke(),
            (t.fillStyle = a.backgroundColor),
            t.beginPath(),
            He(t, { x: i, y: g + 1, w: h - 2, h: l - 2, radius: r }),
            t.fill())
          : ((t.fillStyle = n.multiKeyBackground),
            t.fillRect(e, g, h, l),
            t.strokeRect(e, g, h, l),
            (t.fillStyle = a.backgroundColor),
            t.fillRect(i, g + 1, h - 2, l - 2));
      }
      t.fillStyle = this.labelTextColors[i];
    }
    drawBody(t, e, i) {
      const { body: s } = this,
        {
          bodySpacing: n,
          bodyAlign: o,
          displayColors: a,
          boxHeight: r,
          boxWidth: l,
          boxPadding: h,
        } = i,
        c = Si(i.bodyFont);
      let d = c.lineHeight,
        f = 0;
      const g = Oi(i.rtl, this.x, this.width),
        p = function (i) {
          e.fillText(i, g.x(t.x + f), t.y + d / 2), (t.y += d + n);
        },
        m = g.textAlign(o);
      let x, b, _, y, v, M, w;
      for (
        e.textAlign = o,
          e.textBaseline = "middle",
          e.font = c.string,
          t.x = Ea(this, m, i),
          e.fillStyle = i.bodyColor,
          u(this.beforeBody, p),
          f = a && "right" !== m ? ("center" === o ? l / 2 + h : l + 2 + h) : 0,
          y = 0,
          M = s.length;
        y < M;
        ++y
      ) {
        for (
          x = s[y],
            b = this.labelTextColors[y],
            e.fillStyle = b,
            u(x.before, p),
            _ = x.lines,
            a &&
              _.length &&
              (this._drawColorBox(e, t, y, g, i),
              (d = Math.max(c.lineHeight, r))),
            v = 0,
            w = _.length;
          v < w;
          ++v
        )
          p(_[v]), (d = c.lineHeight);
        u(x.after, p);
      }
      (f = 0), (d = c.lineHeight), u(this.afterBody, p), (t.y -= n);
    }
    drawFooter(t, e, i) {
      const s = this.footer,
        n = s.length;
      let o, a;
      if (n) {
        const r = Oi(i.rtl, this.x, this.width);
        for (
          t.x = Ea(this, i.footerAlign, i),
            t.y += i.footerMarginTop,
            e.textAlign = r.textAlign(i.footerAlign),
            e.textBaseline = "middle",
            o = Si(i.footerFont),
            e.fillStyle = i.footerColor,
            e.font = o.string,
            a = 0;
          a < n;
          ++a
        )
          e.fillText(s[a], r.x(t.x), t.y + o.lineHeight / 2),
            (t.y += o.lineHeight + i.footerSpacing);
      }
    }
    drawBackground(t, e, i, s) {
      const { xAlign: n, yAlign: o } = this,
        { x: a, y: r } = t,
        { width: l, height: h } = i,
        {
          topLeft: c,
          topRight: d,
          bottomLeft: u,
          bottomRight: f,
        } = wi(s.cornerRadius);
      (e.fillStyle = s.backgroundColor),
        (e.strokeStyle = s.borderColor),
        (e.lineWidth = s.borderWidth),
        e.beginPath(),
        e.moveTo(a + c, r),
        "top" === o && this.drawCaret(t, e, i, s),
        e.lineTo(a + l - d, r),
        e.quadraticCurveTo(a + l, r, a + l, r + d),
        "center" === o && "right" === n && this.drawCaret(t, e, i, s),
        e.lineTo(a + l, r + h - f),
        e.quadraticCurveTo(a + l, r + h, a + l - f, r + h),
        "bottom" === o && this.drawCaret(t, e, i, s),
        e.lineTo(a + u, r + h),
        e.quadraticCurveTo(a, r + h, a, r + h - u),
        "center" === o && "left" === n && this.drawCaret(t, e, i, s),
        e.lineTo(a, r + c),
        e.quadraticCurveTo(a, r, a + c, r),
        e.closePath(),
        e.fill(),
        s.borderWidth > 0 && e.stroke();
    }
    _updateAnimationTarget(t) {
      const e = this.chart,
        i = this.$animations,
        s = i && i.x,
        n = i && i.y;
      if (s || n) {
        const i = Sa[t.position].call(this, this._active, this._eventPosition);
        if (!i) return;
        const o = (this._size = Oa(this, t)),
          a = Object.assign({}, i, this._size),
          r = Ta(e, t, a),
          l = La(t, a, r, e);
        (s._to === l.x && n._to === l.y) ||
          ((this.xAlign = r.xAlign),
          (this.yAlign = r.yAlign),
          (this.width = o.width),
          (this.height = o.height),
          (this.caretX = i.x),
          (this.caretY = i.y),
          this._resolveAnimations().update(this, l));
      }
    }
    _willRender() {
      return !!this.opacity;
    }
    draw(t) {
      const e = this.options.setContext(this.getContext());
      let i = this.opacity;
      if (!i) return;
      this._updateAnimationTarget(e);
      const s = { width: this.width, height: this.height },
        n = { x: this.x, y: this.y };
      i = Math.abs(i) < 0.001 ? 0 : i;
      const o = ki(e.padding),
        a =
          this.title.length ||
          this.beforeBody.length ||
          this.body.length ||
          this.afterBody.length ||
          this.footer.length;
      e.enabled &&
        a &&
        (t.save(),
        (t.globalAlpha = i),
        this.drawBackground(n, t, s, e),
        Ai(t, e.textDirection),
        (n.y += o.top),
        this.drawTitle(n, t, e),
        this.drawBody(n, t, e),
        this.drawFooter(n, t, e),
        Ti(t, e.textDirection),
        t.restore());
    }
    getActiveElements() {
      return this._active || [];
    }
    setActiveElements(t, e) {
      const i = this._active,
        s = t.map(({ datasetIndex: t, index: e }) => {
          const i = this.chart.getDatasetMeta(t);
          if (!i) throw new Error("Cannot find a dataset at index " + t);
          return { datasetIndex: t, element: i.data[e], index: e };
        }),
        n = !f(i, s),
        o = this._positionChanged(s, e);
      (n || o) &&
        ((this._active = s),
        (this._eventPosition = e),
        (this._ignoreReplayEvents = !0),
        this.update(!0));
    }
    handleEvent(t, e, i = !0) {
      if (e && this._ignoreReplayEvents) return !1;
      this._ignoreReplayEvents = !1;
      const s = this.options,
        n = this._active || [],
        o = this._getActiveElements(t, n, e, i),
        a = this._positionChanged(o, t),
        r = e || !f(o, n) || a;
      return (
        r &&
          ((this._active = o),
          (s.enabled || s.external) &&
            ((this._eventPosition = { x: t.x, y: t.y }), this.update(!0, e))),
        r
      );
    }
    _getActiveElements(t, e, i, s) {
      const n = this.options;
      if ("mouseout" === t.type) return [];
      if (!s)
        return e.filter(
          (t) =>
            this.chart.data.datasets[t.datasetIndex] &&
            void 0 !==
              this.chart
                .getDatasetMeta(t.datasetIndex)
                .controller.getParsed(t.index)
        );
      const o = this.chart.getElementsAtEventForMode(t, n.mode, n, i);
      return n.reverse && o.reverse(), o;
    }
    _positionChanged(t, e) {
      const { caretX: i, caretY: s, options: n } = this,
        o = Sa[n.position].call(this, t, e);
      return !1 !== o && (i !== o.x || s !== o.y);
    }
  }
  var Ba = {
    id: "tooltip",
    _element: Va,
    positioners: Sa,
    afterInit(t, e, i) {
      i && (t.tooltip = new Va({ chart: t, options: i }));
    },
    beforeUpdate(t, e, i) {
      t.tooltip && t.tooltip.initialize(i);
    },
    reset(t, e, i) {
      t.tooltip && t.tooltip.initialize(i);
    },
    afterDraw(t) {
      const e = t.tooltip;
      if (e && e._willRender()) {
        const i = { tooltip: e };
        if (
          !1 === t.notifyPlugins("beforeTooltipDraw", { ...i, cancelable: !0 })
        )
          return;
        e.draw(t.ctx), t.notifyPlugins("afterTooltipDraw", i);
      }
    },
    afterEvent(t, e) {
      if (t.tooltip) {
        const i = e.replay;
        t.tooltip.handleEvent(e.event, i, e.inChartArea) && (e.changed = !0);
      }
    },
    defaults: {
      enabled: !0,
      external: null,
      position: "average",
      backgroundColor: "rgba(0,0,0,0.8)",
      titleColor: "#fff",
      titleFont: { weight: "bold" },
      titleSpacing: 2,
      titleMarginBottom: 6,
      titleAlign: "left",
      bodyColor: "#fff",
      bodySpacing: 2,
      bodyFont: {},
      bodyAlign: "left",
      footerColor: "#fff",
      footerSpacing: 2,
      footerMarginTop: 6,
      footerFont: { weight: "bold" },
      footerAlign: "left",
      padding: 6,
      caretPadding: 2,
      caretSize: 5,
      cornerRadius: 6,
      boxHeight: (t, e) => e.bodyFont.size,
      boxWidth: (t, e) => e.bodyFont.size,
      multiKeyBackground: "#fff",
      displayColors: !0,
      boxPadding: 0,
      borderColor: "rgba(0,0,0,0)",
      borderWidth: 0,
      animation: { duration: 400, easing: "easeOutQuart" },
      animations: {
        numbers: {
          type: "number",
          properties: ["x", "y", "width", "height", "caretX", "caretY"],
        },
        opacity: { easing: "linear", duration: 200 },
      },
      callbacks: za,
    },
    defaultRoutes: { bodyFont: "font", footerFont: "font", titleFont: "font" },
    descriptors: {
      _scriptable: (t) =>
        "filter" !== t && "itemSort" !== t && "external" !== t,
      _indexable: !1,
      callbacks: { _scriptable: !1, _indexable: !1 },
      animation: { _fallback: !1 },
      animations: { _fallback: "animation" },
    },
    additionalOptionScopes: ["interaction"],
  };
  return (
    An.register(Yn, jo, fo, t),
    (An.helpers = { ...Wi }),
    (An._adapters = Rn),
    (An.Animation = Cs),
    (An.Animations = Os),
    (An.animator = bt),
    (An.controllers = en.controllers.items),
    (An.DatasetController = Ns),
    (An.Element = Hs),
    (An.elements = fo),
    (An.Interaction = Xi),
    (An.layouts = as),
    (An.platforms = Ss),
    (An.Scale = Js),
    (An.Ticks = ae),
    Object.assign(An, Yn, jo, fo, t, Ss),
    (An.Chart = An),
    "undefined" != typeof window && (window.Chart = An),
    An
  );
});
//# sourceMappingURL=chart.umd.js.map

/*!
 * chartjs-plugin-datalabels v2.2.0
 * https://chartjs-plugin-datalabels.netlify.app
 * (c) 2017-2022 chartjs-plugin-datalabels contributors
 * Released under the MIT license
 */
!(function (t, e) {
  "object" == typeof exports && "undefined" != typeof module
    ? (module.exports = e(require("chart.js/helpers"), require("chart.js")))
    : "function" == typeof define && define.amd
    ? define(["chart.js/helpers", "chart.js"], e)
    : ((t =
        "undefined" != typeof globalThis
          ? globalThis
          : t || self).ChartDataLabels = e(t.Chart.helpers, t.Chart));
})(this, function (t, e) {
  "use strict";
  var r = (function () {
      if ("undefined" != typeof window) {
        if (window.devicePixelRatio) return window.devicePixelRatio;
        var t = window.screen;
        if (t) return (t.deviceXDPI || 1) / (t.logicalXDPI || 1);
      }
      return 1;
    })(),
    a = function (e) {
      var r,
        a = [];
      for (e = [].concat(e); e.length; )
        "string" == typeof (r = e.pop())
          ? a.unshift.apply(a, r.split("\n"))
          : Array.isArray(r)
          ? e.push.apply(e, r)
          : t.isNullOrUndef(e) || a.unshift("" + r);
      return a;
    },
    o = function (t, e, r) {
      var a,
        o = [].concat(e),
        n = o.length,
        i = t.font,
        l = 0;
      for (t.font = r.string, a = 0; a < n; ++a)
        l = Math.max(t.measureText(o[a]).width, l);
      return (t.font = i), { height: n * r.lineHeight, width: l };
    },
    n = function (t, e, r) {
      return Math.max(t, Math.min(e, r));
    },
    i = function (t, e) {
      var r,
        a,
        o,
        n,
        i = t.slice(),
        l = [];
      for (r = 0, o = e.length; r < o; ++r)
        (n = e[r]), -1 === (a = i.indexOf(n)) ? l.push([n, 1]) : i.splice(a, 1);
      for (r = 0, o = i.length; r < o; ++r) l.push([i[r], -1]);
      return l;
    };
  function l(t, e) {
    var r = e.x,
      a = e.y;
    if (null === r) return { x: 0, y: -1 };
    if (null === a) return { x: 1, y: 0 };
    var o = t.x - r,
      n = t.y - a,
      i = Math.sqrt(o * o + n * n);
    return { x: i ? o / i : 0, y: i ? n / i : -1 };
  }
  function s(t, e, r) {
    var a = 0;
    return (
      t < r.left ? (a |= 1) : t > r.right && (a |= 2),
      e < r.top ? (a |= 8) : e > r.bottom && (a |= 4),
      a
    );
  }
  function u(t, e) {
    var r,
      a,
      o = e.anchor,
      n = t;
    return (
      e.clamp &&
        (n = (function (t, e) {
          for (
            var r,
              a,
              o,
              n = t.x0,
              i = t.y0,
              l = t.x1,
              u = t.y1,
              d = s(n, i, e),
              c = s(l, u, e);
            d | c && !(d & c);

          )
            8 & (r = d || c)
              ? ((a = n + ((l - n) * (e.top - i)) / (u - i)), (o = e.top))
              : 4 & r
              ? ((a = n + ((l - n) * (e.bottom - i)) / (u - i)), (o = e.bottom))
              : 2 & r
              ? ((o = i + ((u - i) * (e.right - n)) / (l - n)), (a = e.right))
              : 1 & r &&
                ((o = i + ((u - i) * (e.left - n)) / (l - n)), (a = e.left)),
              r === d
                ? (d = s((n = a), (i = o), e))
                : (c = s((l = a), (u = o), e));
          return { x0: n, x1: l, y0: i, y1: u };
        })(n, e.area)),
      "start" === o
        ? ((r = n.x0), (a = n.y0))
        : "end" === o
        ? ((r = n.x1), (a = n.y1))
        : ((r = (n.x0 + n.x1) / 2), (a = (n.y0 + n.y1) / 2)),
      (function (t, e, r, a, o) {
        switch (o) {
          case "center":
            r = a = 0;
            break;
          case "bottom":
            (r = 0), (a = 1);
            break;
          case "right":
            (r = 1), (a = 0);
            break;
          case "left":
            (r = -1), (a = 0);
            break;
          case "top":
            (r = 0), (a = -1);
            break;
          case "start":
            (r = -r), (a = -a);
            break;
          case "end":
            break;
          default:
            (o *= Math.PI / 180), (r = Math.cos(o)), (a = Math.sin(o));
        }
        return { x: t, y: e, vx: r, vy: a };
      })(r, a, t.vx, t.vy, e.align)
    );
  }
  var d = function (t, e) {
      var r = (t.startAngle + t.endAngle) / 2,
        a = Math.cos(r),
        o = Math.sin(r),
        n = t.innerRadius,
        i = t.outerRadius;
      return u(
        {
          x0: t.x + a * n,
          y0: t.y + o * n,
          x1: t.x + a * i,
          y1: t.y + o * i,
          vx: a,
          vy: o,
        },
        e
      );
    },
    c = function (t, e) {
      var r = l(t, e.origin),
        a = r.x * t.options.radius,
        o = r.y * t.options.radius;
      return u(
        {
          x0: t.x - a,
          y0: t.y - o,
          x1: t.x + a,
          y1: t.y + o,
          vx: r.x,
          vy: r.y,
        },
        e
      );
    },
    h = function (t, e) {
      var r = l(t, e.origin),
        a = t.x,
        o = t.y,
        n = 0,
        i = 0;
      return (
        t.horizontal
          ? ((a = Math.min(t.x, t.base)), (n = Math.abs(t.base - t.x)))
          : ((o = Math.min(t.y, t.base)), (i = Math.abs(t.base - t.y))),
        u({ x0: a, y0: o + i, x1: a + n, y1: o, vx: r.x, vy: r.y }, e)
      );
    },
    f = function (t, e) {
      var r = l(t, e.origin);
      return u(
        {
          x0: t.x,
          y0: t.y,
          x1: t.x + (t.width || 0),
          y1: t.y + (t.height || 0),
          vx: r.x,
          vy: r.y,
        },
        e
      );
    },
    x = function (t) {
      return Math.round(t * r) / r;
    };
  function y(t, e) {
    var r = e.chart.getDatasetMeta(e.datasetIndex).vScale;
    if (!r) return null;
    if (void 0 !== r.xCenter && void 0 !== r.yCenter)
      return { x: r.xCenter, y: r.yCenter };
    var a = r.getBasePixel();
    return t.horizontal ? { x: a, y: null } : { x: null, y: a };
  }
  function v(t, e, r) {
    var a = r.backgroundColor,
      o = r.borderColor,
      n = r.borderWidth;
    (a || (o && n)) &&
      (t.beginPath(),
      (function (t, e, r, a, o, n) {
        var i = Math.PI / 2;
        if (n) {
          var l = Math.min(n, o / 2, a / 2),
            s = e + l,
            u = r + l,
            d = e + a - l,
            c = r + o - l;
          t.moveTo(e, u),
            s < d && u < c
              ? (t.arc(s, u, l, -Math.PI, -i),
                t.arc(d, u, l, -i, 0),
                t.arc(d, c, l, 0, i),
                t.arc(s, c, l, i, Math.PI))
              : s < d
              ? (t.moveTo(s, r),
                t.arc(d, u, l, -i, i),
                t.arc(s, u, l, i, Math.PI + i))
              : u < c
              ? (t.arc(s, u, l, -Math.PI, 0), t.arc(s, c, l, 0, Math.PI))
              : t.arc(s, u, l, -Math.PI, Math.PI),
            t.closePath(),
            t.moveTo(e, r);
        } else t.rect(e, r, a, o);
      })(
        t,
        x(e.x) + n / 2,
        x(e.y) + n / 2,
        x(e.w) - n,
        x(e.h) - n,
        r.borderRadius
      ),
      t.closePath(),
      a && ((t.fillStyle = a), t.fill()),
      o &&
        n &&
        ((t.strokeStyle = o),
        (t.lineWidth = n),
        (t.lineJoin = "miter"),
        t.stroke()));
  }
  function b(t, e, r) {
    var a = t.shadowBlur,
      o = r.stroked,
      n = x(r.x),
      i = x(r.y),
      l = x(r.w);
    o && t.strokeText(e, n, i, l),
      r.filled &&
        (a && o && (t.shadowBlur = 0),
        t.fillText(e, n, i, l),
        a && o && (t.shadowBlur = a));
  }
  var _ = function (t, e, r, a) {
    var o = this;
    (o._config = t),
      (o._index = a),
      (o._model = null),
      (o._rects = null),
      (o._ctx = e),
      (o._el = r);
  };
  t.merge(_.prototype, {
    _modelize: function (r, a, n, i) {
      var l,
        s = this,
        u = s._index,
        x = t.toFont(t.resolve([n.font, {}], i, u)),
        v = t.resolve([n.color, e.defaults.color], i, u);
      return {
        align: t.resolve([n.align, "center"], i, u),
        anchor: t.resolve([n.anchor, "center"], i, u),
        area: i.chart.chartArea,
        backgroundColor: t.resolve([n.backgroundColor, null], i, u),
        borderColor: t.resolve([n.borderColor, null], i, u),
        borderRadius: t.resolve([n.borderRadius, 0], i, u),
        borderWidth: t.resolve([n.borderWidth, 0], i, u),
        clamp: t.resolve([n.clamp, !1], i, u),
        clip: t.resolve([n.clip, !1], i, u),
        color: v,
        display: r,
        font: x,
        lines: a,
        offset: t.resolve([n.offset, 4], i, u),
        opacity: t.resolve([n.opacity, 1], i, u),
        origin: y(s._el, i),
        padding: t.toPadding(t.resolve([n.padding, 4], i, u)),
        positioner:
          ((l = s._el),
          l instanceof e.ArcElement
            ? d
            : l instanceof e.PointElement
            ? c
            : l instanceof e.BarElement
            ? h
            : f),
        rotation: t.resolve([n.rotation, 0], i, u) * (Math.PI / 180),
        size: o(s._ctx, a, x),
        textAlign: t.resolve([n.textAlign, "start"], i, u),
        textShadowBlur: t.resolve([n.textShadowBlur, 0], i, u),
        textShadowColor: t.resolve([n.textShadowColor, v], i, u),
        textStrokeColor: t.resolve([n.textStrokeColor, v], i, u),
        textStrokeWidth: t.resolve([n.textStrokeWidth, 0], i, u),
      };
    },
    update: function (e) {
      var r,
        o,
        n,
        i = this,
        l = null,
        s = null,
        u = i._index,
        d = i._config,
        c = t.resolve([d.display, !0], e, u);
      c &&
        ((r = e.dataset.data[u]),
        (o = t.valueOrDefault(t.callback(d.formatter, [r, e]), r)),
        (n = t.isNullOrUndef(o) ? [] : a(o)).length &&
          (s = (function (t) {
            var e = t.borderWidth || 0,
              r = t.padding,
              a = t.size.height,
              o = t.size.width,
              n = -o / 2,
              i = -a / 2;
            return {
              frame: {
                x: n - r.left - e,
                y: i - r.top - e,
                w: o + r.width + 2 * e,
                h: a + r.height + 2 * e,
              },
              text: { x: n, y: i, w: o, h: a },
            };
          })((l = i._modelize(c, n, d, e))))),
        (i._model = l),
        (i._rects = s);
    },
    geometry: function () {
      return this._rects ? this._rects.frame : {};
    },
    rotation: function () {
      return this._model ? this._model.rotation : 0;
    },
    visible: function () {
      return this._model && this._model.opacity;
    },
    model: function () {
      return this._model;
    },
    draw: function (t, e) {
      var r,
        a = t.ctx,
        o = this._model,
        i = this._rects;
      this.visible() &&
        (a.save(),
        o.clip &&
          ((r = o.area),
          a.beginPath(),
          a.rect(r.left, r.top, r.right - r.left, r.bottom - r.top),
          a.clip()),
        (a.globalAlpha = n(0, o.opacity, 1)),
        a.translate(x(e.x), x(e.y)),
        a.rotate(o.rotation),
        v(a, i.frame, o),
        (function (t, e, r, a) {
          var o,
            n = a.textAlign,
            i = a.color,
            l = !!i,
            s = a.font,
            u = e.length,
            d = a.textStrokeColor,
            c = a.textStrokeWidth,
            h = d && c;
          if (u && (l || h))
            for (
              r = (function (t, e, r) {
                var a = r.lineHeight,
                  o = t.w,
                  n = t.x;
                return (
                  "center" === e
                    ? (n += o / 2)
                    : ("end" !== e && "right" !== e) || (n += o),
                  { h: a, w: o, x: n, y: t.y + a / 2 }
                );
              })(r, n, s),
                t.font = s.string,
                t.textAlign = n,
                t.textBaseline = "middle",
                t.shadowBlur = a.textShadowBlur,
                t.shadowColor = a.textShadowColor,
                l && (t.fillStyle = i),
                h &&
                  ((t.lineJoin = "round"),
                  (t.lineWidth = c),
                  (t.strokeStyle = d)),
                o = 0,
                u = e.length;
              o < u;
              ++o
            )
              b(t, e[o], {
                stroked: h,
                filled: l,
                w: r.w,
                x: r.x,
                y: r.y + r.h * o,
              });
        })(a, o.lines, i.text, o),
        a.restore());
    },
  });
  var p = Number.MIN_SAFE_INTEGER || -9007199254740991,
    g = Number.MAX_SAFE_INTEGER || 9007199254740991;
  function m(t, e, r) {
    var a = Math.cos(r),
      o = Math.sin(r),
      n = e.x,
      i = e.y;
    return {
      x: n + a * (t.x - n) - o * (t.y - i),
      y: i + o * (t.x - n) + a * (t.y - i),
    };
  }
  function w(t, e) {
    var r,
      a,
      o,
      n,
      i,
      l = g,
      s = p,
      u = e.origin;
    for (r = 0; r < t.length; ++r)
      (o = (a = t[r]).x - u.x),
        (n = a.y - u.y),
        (i = e.vx * o + e.vy * n),
        (l = Math.min(l, i)),
        (s = Math.max(s, i));
    return { min: l, max: s };
  }
  function M(t, e) {
    var r = e.x - t.x,
      a = e.y - t.y,
      o = Math.sqrt(r * r + a * a);
    return { vx: (e.x - t.x) / o, vy: (e.y - t.y) / o, origin: t, ln: o };
  }
  var k = function () {
    (this._rotation = 0), (this._rect = { x: 0, y: 0, w: 0, h: 0 });
  };
  function $(t, e, r) {
    var a = e.positioner(t, e),
      o = a.vx,
      n = a.vy;
    if (!o && !n) return { x: a.x, y: a.y };
    var i = r.w,
      l = r.h,
      s = e.rotation,
      u = Math.abs((i / 2) * Math.cos(s)) + Math.abs((l / 2) * Math.sin(s)),
      d = Math.abs((i / 2) * Math.sin(s)) + Math.abs((l / 2) * Math.cos(s)),
      c = 1 / Math.max(Math.abs(o), Math.abs(n));
    return (
      (u *= o * c),
      (d *= n * c),
      (u += e.offset * o),
      (d += e.offset * n),
      { x: a.x + u, y: a.y + d }
    );
  }
  t.merge(k.prototype, {
    center: function () {
      var t = this._rect;
      return { x: t.x + t.w / 2, y: t.y + t.h / 2 };
    },
    update: function (t, e, r) {
      (this._rotation = r),
        (this._rect = { x: e.x + t.x, y: e.y + t.y, w: e.w, h: e.h });
    },
    contains: function (t) {
      var e = this,
        r = e._rect;
      return !(
        (t = m(t, e.center(), -e._rotation)).x < r.x - 1 ||
        t.y < r.y - 1 ||
        t.x > r.x + r.w + 2 ||
        t.y > r.y + r.h + 2
      );
    },
    intersects: function (t) {
      var e,
        r,
        a,
        o = this._points(),
        n = t._points(),
        i = [M(o[0], o[1]), M(o[0], o[3])];
      for (
        this._rotation !== t._rotation && i.push(M(n[0], n[1]), M(n[0], n[3])),
          e = 0;
        e < i.length;
        ++e
      )
        if (
          ((r = w(o, i[e])), (a = w(n, i[e])), r.max < a.min || a.max < r.min)
        )
          return !1;
      return !0;
    },
    _points: function () {
      var t = this,
        e = t._rect,
        r = t._rotation,
        a = t.center();
      return [
        m({ x: e.x, y: e.y }, a, r),
        m({ x: e.x + e.w, y: e.y }, a, r),
        m({ x: e.x + e.w, y: e.y + e.h }, a, r),
        m({ x: e.x, y: e.y + e.h }, a, r),
      ];
    },
  });
  var C = {
      prepare: function (t) {
        var e,
          r,
          a,
          o,
          n,
          i = [];
        for (e = 0, a = t.length; e < a; ++e)
          for (r = 0, o = t[e].length; r < o; ++r)
            (n = t[e][r]),
              i.push(n),
              (n.$layout = {
                _box: new k(),
                _hidable: !1,
                _visible: !0,
                _set: e,
                _idx: n._index,
              });
        return (
          i.sort(function (t, e) {
            var r = t.$layout,
              a = e.$layout;
            return r._idx === a._idx ? a._set - r._set : a._idx - r._idx;
          }),
          this.update(i),
          i
        );
      },
      update: function (t) {
        var e,
          r,
          a,
          o,
          n,
          i = !1;
        for (e = 0, r = t.length; e < r; ++e)
          (o = (a = t[e]).model()),
            ((n = a.$layout)._hidable = o && "auto" === o.display),
            (n._visible = a.visible()),
            (i |= n._hidable);
        i &&
          (function (t) {
            var e, r, a, o, n, i, l;
            for (e = 0, r = t.length; e < r; ++e)
              (o = (a = t[e]).$layout)._visible &&
                ((l = new Proxy(a._el, {
                  get: (t, e) => t.getProps([e], !0)[e],
                })),
                (n = a.geometry()),
                (i = $(l, a.model(), n)),
                o._box.update(i, n, a.rotation()));
            (function (t, e) {
              var r, a, o, n;
              for (r = t.length - 1; r >= 0; --r)
                for (o = t[r].$layout, a = r - 1; a >= 0 && o._visible; --a)
                  (n = t[a].$layout)._visible &&
                    o._box.intersects(n._box) &&
                    e(o, n);
            })(t, function (t, e) {
              var r = t._hidable,
                a = e._hidable;
              (r && a) || a ? (e._visible = !1) : r && (t._visible = !1);
            });
          })(t);
      },
      lookup: function (t, e) {
        var r, a;
        for (r = t.length - 1; r >= 0; --r)
          if ((a = t[r].$layout) && a._visible && a._box.contains(e))
            return t[r];
        return null;
      },
      draw: function (t, e) {
        var r, a, o, n, i, l;
        for (r = 0, a = e.length; r < a; ++r)
          (n = (o = e[r]).$layout)._visible &&
            ((i = o.geometry()),
            (l = $(o._el, o.model(), i)),
            n._box.update(l, i, o.rotation()),
            o.draw(t, l));
      },
    },
    P = "$default";
  function S(e, r, a, o) {
    if (r) {
      var n,
        i = a.$context,
        l = a.$groups;
      r[l._set] &&
        (n = r[l._set][l._key]) &&
        !0 === t.callback(n, [i, o]) &&
        ((e.$datalabels._dirty = !0), a.update(i));
    }
  }
  function I(t, e) {
    var r,
      a,
      o = t.$datalabels,
      n = o._listeners;
    if (n.enter || n.leave) {
      if ("mousemove" === e.type) a = C.lookup(o._labels, e);
      else if ("mouseout" !== e.type) return;
      (r = o._hovered),
        (o._hovered = a),
        (function (t, e, r, a, o) {
          var n, i;
          (r || a) &&
            (r ? (a ? r !== a && (i = n = !0) : (i = !0)) : (n = !0),
            i && S(t, e.leave, r, o),
            n && S(t, e.enter, a, o));
        })(t, n, r, a, e);
    }
  }
  return {
    id: "datalabels",
    defaults: {
      align: "center",
      anchor: "center",
      backgroundColor: null,
      borderColor: null,
      borderRadius: 0,
      borderWidth: 0,
      clamp: !1,
      clip: !1,
      color: void 0,
      display: !0,
      font: {
        family: void 0,
        lineHeight: 1.2,
        size: void 0,
        style: void 0,
        weight: null,
      },
      formatter: function (e) {
        if (t.isNullOrUndef(e)) return null;
        var r,
          a,
          o,
          n = e;
        if (t.isObject(e))
          if (t.isNullOrUndef(e.label))
            if (t.isNullOrUndef(e.r))
              for (n = "", o = 0, a = (r = Object.keys(e)).length; o < a; ++o)
                n += (0 !== o ? ", " : "") + r[o] + ": " + e[r[o]];
            else n = e.r;
          else n = e.label;
        return "" + n;
      },
      labels: void 0,
      listeners: {},
      offset: 4,
      opacity: 1,
      padding: { top: 4, right: 4, bottom: 4, left: 4 },
      rotation: 0,
      textAlign: "start",
      textStrokeColor: void 0,
      textStrokeWidth: 0,
      textShadowBlur: 0,
      textShadowColor: void 0,
    },
    beforeInit: function (t) {
      t.$datalabels = { _actives: [] };
    },
    beforeUpdate: function (t) {
      var e = t.$datalabels;
      (e._listened = !1),
        (e._listeners = {}),
        (e._datasets = []),
        (e._labels = []);
    },
    afterDatasetUpdate: function (e, r, a) {
      var o,
        n,
        i,
        l,
        s,
        u,
        d,
        c,
        h = r.index,
        f = e.$datalabels,
        x = (f._datasets[h] = []),
        y = e.isDatasetVisible(h),
        v = e.data.datasets[h],
        b = (function (e, r) {
          var a,
            o,
            n,
            i = e.datalabels,
            l = [];
          return !1 === i
            ? null
            : (!0 === i && (i = {}),
              (r = t.merge({}, [r, i])),
              (o = r.labels || {}),
              (n = Object.keys(o)),
              delete r.labels,
              n.length
                ? n.forEach(function (e) {
                    o[e] && l.push(t.merge({}, [r, o[e], { _key: e }]));
                  })
                : l.push(r),
              (a = l.reduce(function (e, r) {
                return (
                  t.each(r.listeners || {}, function (t, a) {
                    (e[a] = e[a] || {}), (e[a][r._key || P] = t);
                  }),
                  delete r.listeners,
                  e
                );
              }, {})),
              { labels: l, listeners: a });
        })(v, a),
        p = r.meta.data || [],
        g = e.ctx;
      for (g.save(), o = 0, i = p.length; o < i; ++o)
        if (
          (((d = p[o]).$datalabels = []),
          y && d && e.getDataVisibility(o) && !d.skip)
        )
          for (n = 0, l = b.labels.length; n < l; ++n)
            (u = (s = b.labels[n])._key),
              ((c = new _(s, g, d, o)).$groups = { _set: h, _key: u || P }),
              (c.$context = {
                active: !1,
                chart: e,
                dataIndex: o,
                dataset: v,
                datasetIndex: h,
              }),
              c.update(c.$context),
              d.$datalabels.push(c),
              x.push(c);
      g.restore(),
        t.merge(f._listeners, b.listeners, {
          merger: function (t, e, a) {
            (e[t] = e[t] || {}), (e[t][r.index] = a[t]), (f._listened = !0);
          },
        });
    },
    afterUpdate: function (t) {
      t.$datalabels._labels = C.prepare(t.$datalabels._datasets);
    },
    afterDatasetsDraw: function (t) {
      C.draw(t, t.$datalabels._labels);
    },
    beforeEvent: function (t, e) {
      if (t.$datalabels._listened) {
        var r = e.event;
        switch (r.type) {
          case "mousemove":
          case "mouseout":
            I(t, r);
            break;
          case "click":
            !(function (t, e) {
              var r = t.$datalabels,
                a = r._listeners.click,
                o = a && C.lookup(r._labels, e);
              o && S(t, a, o, e);
            })(t, r);
        }
      }
    },
    afterEvent: function (t) {
      var e,
        r,
        a,
        o,
        n,
        l,
        s,
        u = t.$datalabels,
        d = u._actives,
        c = (u._actives = t.getActiveElements()),
        h = i(d, c);
      for (e = 0, r = h.length; e < r; ++e)
        if ((n = h[e])[1])
          for (
            a = 0, o = (s = n[0].element.$datalabels || []).length;
            a < o;
            ++a
          )
            ((l = s[a]).$context.active = 1 === n[1]), l.update(l.$context);
      (u._dirty || h.length) && (C.update(u._labels), t.render()),
        delete u._dirty;
    },
  };
});
